sed命令在找到特定模式后替换特定值

时间:2011-10-09 12:19:31

标签: sed

我对unix命令感到有些困惑。

我有一个名为file.txt的文件,其中包含以下内容:

customer1表

名=爱丽丝

通= UNIX

DOB =

顾客2

名=毁灭

=通过窗户

DOB =

我基本上想要的是使用一个unix命令,它允许我为客户grep(即Customer1),然后给它的dob一个值,例如dob = 1912

所以file.txt会变得像

customer1表

名=爱丽丝

通= UNIX

DOB = 1912

我一直在使用sed,这是我制定的命令:

sed“s / $(awk'c - > 0; / Customer1 / {c = 3}'file.txt | tail -1)/ dob = 1234 / g”-i file.txt

然而,这将用dob = 1234替换所有出现的dob(非常明显)。

有人可以给我一个提示,告诉我如何为每个客户锁定特定的dob并替换它吗?

提前致谢。

3 个答案:

答案 0 :(得分:1)

awk可以自己做。看下面的一个衬垫:

 awk 'BEGIN{RS="dob=";OFS="\n\n"}$1~/Customer1/{$0=$0"dob=1234";print}' input

测试:将customer1的dob值更改为7777:

kent$  cat t.txt
Customer1

name=Alice

pass=unix

dob=

Customer2

name=Destroyer

pass=windows

dob=

kent$  awk 'BEGIN{RS="dob=";OFS="\n\n"}$1~/Customer1/{$0=$0"dob=7777";print}' t.txt

Customer1

name=Alice

pass=unix

dob=7777

更新

kent$  awk 'BEGIN{RS="dob=";OFS="\n\n"}$1~/Customer1/{$0=$0"dob=7777";print > "t.txt"}' t.txt

kent$  cat t.txt
Customer1

name=Alice

pass=unix

dob=7777

再次更新

kent$  awk '/Customer1/{a++;}/dob=/&&a{$0="dob=7777";a=0;}1' t.txt > tmp.txt && mv tmp.txt t.txt

kent$  cat t.txt
Customer1

name=Alice

pass=unix

dob=7777

Customer2

name=Destroyer

pass=windows

dob=
使用sed 更新 实际上,使用sed(使用方便的-i选项)来处理这个也是可能的。我没有正确理解您的要求,我认为您只想要特定的客户块。所以我选择了awk。现在是sed版本:

kent$  sed -ir '/Customer1/{x;s/.*/a/;x;} 
/dob=/{x;
        /a/{s/a//g; x;
                s/.*/dob=1234/; x;};
        x}' t.txt

kent$  cat t.txt
Customer1

name=Alice

pass=unix

dob=1234

Customer2

name=Destroyer

pass=windows

dob=

答案 1 :(得分:0)

您可以使用awk的模式匹配来限制行的范围。例如,(假设您的输入文件使用“user”而不是“name”,正如您给出两个示例所示):

$ awk /user=alice/,/^Customer/{ if( $0 == "dob=" ) $0="dob=1234"} {print} file.txt

应该用“1234”替换alice的dob

如果您有gnu sed,可以使用-i替换文件中的文本(在执行此操作之前对其进行测试)。或根据需要使用重定向。

答案 2 :(得分:0)

在这种情况下,使用awk可以提供帮助:

 searchfor=Customer1
 replacefield=dob
 newvalue=1912

 awk -F'=' '
   /^'"$searchfor"'$/ { do_something = 1 }
   do_something && $1 == "'"$replacefield"'" { print $1 "='"$newvalue"'"; do_something = 0; next }
   { print }
 ' dat1