sed:搜索并替换变量列

时间:2009-09-22 02:22:17

标签: bash sed

我得到一个文件,字段用冒号(:)分隔,我需要不时更改第二个字段。该文件如下:

name1:UhX.PPFW7$YhPMH0BISY:23490::::::
name2:1./0oV$GEs6WJpE$LHXhy:19239:0:29388:2::29302:
...

文件的第二个字段会偶尔更改,可能包含一些正则表达式字符($。)和正斜杠。

我只想替换第二个字段,因为将来跟随它的数据可能会有所不同。如果我这样做:

sed -e "s~^name2:.*:~name2:aTest\$repl.ace:~g" tst

第二栏右侧的文字丢失了:

name2:aTest$repl.ace:

(即'19239:0:29388:2 :: 29302:')。有没有办法让sed可以替换变化的列并保留其余的线?或者,可能有更好的方案来做到这一点吗?

3 个答案:

答案 0 :(得分:0)

Sed可能不是最好的工具,因为如果不真正了解字段。请考虑awk(具有内置的字段概念):

$ awk -F : 'NF>=2{split($0,a,":");a[2]="new sting";printf(a[1]);for(i=2;i<=NF;i++){printf":%s",a[i]};printf("\n");}' <input file>

或格式化以便于阅读:

awk -F : 'NF>=2 {
                   split($0,a,":");
                   a[2]="new sting";
                   printf(a[1]);
                   for(i=2;i<=NF;i++){
                     printf":%s",a[i]
                   };
                   printf("\n");
                 }' <input file>

一般情况下,您可能希望将":"替换为FS。另外值得一看的是t his join function,如果您编写脚本而不是在命令行上运行,这将使实现更清晰。

此实现假定您要替换 all 第二个字段。如果您只需要选择一些行进行替换,请将模式更改为

$2=="string to match"

$2~/regex to match/

答案 1 :(得分:0)

试试这个:

perl -pe 's~^name2:.*?:~name2:aTest\$repl.ace:~g' test

答案 2 :(得分:0)

最简单的方法是更改​​正则表达式中的。*以仅匹配实际出现在第二个字段中的内容,例如:

sed -e "s~^name2:[^:]*:~name2:aTest\$repl.ace:~g" tst

([^:] * ==任何不包含冒号的东西)或:

sed -e "s~^name2:[$./0-9a-zA-Z]*:~name2:aTest\$repl.ace:~g" tst

([blah] * ==列出的任意数量的字符)