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

时间:2019-04-20 19:39:37

标签: linux bash awk sed

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

例如:足球将被交换为-> Foo#ball

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

7 个答案:

答案 0 :(得分:4)

使用GNU sed和两个s命令:

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

输出:

Foo#ball

请参阅:3.3 The s Command5.7 Back-references and Subexpressions5.9.2 Upper/Lower case conversion

答案 1 :(得分:3)

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

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

答案 2 :(得分: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

虽然外壳通常较慢,但仅限于内置使用时,并不会落后太多。

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

答案 3 :(得分:1)

Cyrus或Potong的答案是首选。 (对于Linux或由于\ U或\ u而使用GNU sed的系统。)

这只是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上运行。

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

这适用于任何版本的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#

答案 6 :(得分:0)

如果您的数据位于“ d”文件中,请尝试使用gnu sed:

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