我得到一个文件,字段用冒号(:)分隔,我需要不时更改第二个字段。该文件如下:
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可以替换变化的列并保留其余的线?或者,可能有更好的方案来做到这一点吗?
答案 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] * ==列出的任意数量的字符)