繁体   English   中英

在linux中替换文件的每一行中的字符

[英]Replacing characters in each line on a file in linux

我有一个文件,每行都有不同的单词。 我的目标是将第一个字符替换为大写字母,并将第三个字符替换为“#”。

例如: football将交换为Foo#ball

我尝试考虑使用 awk 和 sed。这对我没有帮助,因为(据我所知)sed 需要精确的字符输入,而 awk 可以打印所需的字符但不能更改它。

使用 GNU sed 和两个s命令:

echo 'football' | sed -E 's/(.)/\U\1/; s/(...)./\1#/'

输出:

Foo#ball

请参阅: 3.3 s 命令5.7 反向引用和子表达式以及5.9.2 大写/小写转换

使用 bash,您可以单独使用参数扩展来完成任务。 例如,如果您将每一行读入变量line ,您可以这样做:

line="${line^}"                # change football to Football (capitalize 1st char)
line="${line:0:3}#${line:4}"   # make 4th character '#'

示例输入文件

$ cat file
football
soccer
baseball

示例使用/输出

$ while read -r line; do line="${line^}"; echo "${line:0:3}#${line:4}"; done < file
Foo#ball
Soc#er
Bas#ball

虽然 shell 通常较慢,但当使用仅限于内置时,它不会落后太多。

注意:您的问题是第 3 个字符,但您的示例将第 4 个字符替换为'#'

这可能对您有用(GNU sed):

sed 's/\(...\)./\u\1#/' file

Cyrus 或 Potong 的答案是首选答案。 (对于 Linux 或具有 GNU sed 的系统,因为 \U 或 \u。)

这只是 awk 的一个附加解决方案,因为您提到了它并且还使用了 awk 标签:

$ echo 'football'|awk '{a=substr($0,1,1);b=substr($0,2,2);c=substr($0,5);print toupper(a)b"#"c}'
Foo#ball

这是没有 RegEx 的最简单的解决方案。 它也适用于非 GNU awk。

使用 GNU awk 将第三个参数匹配():

$ echo 'football' | awk 'match($0,/(.)(..).(.*)/,a){$0=toupper(a[1]) a[2] "#" a[3]} 1'
Foo#ball

这应该适用于任何版本的awk

awk '{
    for(i=1;i<=NF;i++){
        # Note that string indexes start at 1 in awk !
        $i=toupper(substr($i,1,1)) "" substr($i,2,1) "#" substr($i,3)
    }
    print
}' file

注意:如果一个单词的长度小于3个字符,点赞it会打印为It#

如果您的数据在“d”文件中,请在 gnu sed 上尝试:

sed -E 's/^(\w)(\w\w)\w/\U\1\E\2#/' d

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM