我对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并替换它吗?
提前致谢。
答案 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=
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