查找特定图案后替换特定值的sed命令
我有点被unix命令卡住了 我有一个名为file.txt的文件,内容如下: 顾客1 name=Alice pass=unix 多巴哥= 顾客2 名称=驱逐舰 通过=窗口 多巴哥= 我基本上想要的是使用一个unix命令,允许我为客户(即Customer1)grep,然后给它的dob一个值,例如dob=1912 因此file.txt将变成 顾客1 name=Alice pass=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(非常明显)查找特定图案后替换特定值的sed命令,sed,Sed,我有点被unix命令卡住了 我有一个名为file.txt的文件,内容如下: 顾客1 name=Alice pass=unix 多巴哥= 顾客2 名称=驱逐舰 通过=窗口 多巴哥= 我基本上想要的是使用一个unix命令,允许我为客户(即Customer1)grep,然后给它的dob一个值,例如dob=1912 因此file.txt将变成 顾客1 name=Alice pass=unix dob=1912 我一直在与sed合作,下面是我制定的命令: sed“s/$(awk'c-->0;/Custom
有人能告诉我如何锁定每个客户的特定dob并更换它吗
提前感谢。您可以使用awk的模式匹配来限制行的范围。例如,(假设您的输入文件使用“user”而不是“name”,正如您给出的两个示例所示): $awk/user=alice/,/^Customer/{if($0==“dob=”)$0=“dob=1234”}{print}file.txt 应将alice的dob替换为“1234”
如果您使用了gnu sed,那么可以使用-i替换文件中的文本(在执行此操作之前对其进行测试)。或者根据需要使用重定向。在这种情况下,使用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
awk可以自己做。请参见下面的一行:
awk 'BEGIN{RS="dob=";OFS="\n\n"}$1~/Customer1/{$0=$0"dob=1234";print}' input
测试:将客户1的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=
命令运行良好:)非常感谢。不过我有个问题,我想替换dob并保存文件。当然,我不能使用重定向,你建议我如何继续?我使用sed是因为-I选项,等待您的回复,再次感谢:)在这种情况下有没有可能避免重定向?刚才看到了,这会覆盖文件,我只想修改dob字段,因为如果我有多个客户(Customer2、Customer3等),这些字段将消失。有什么可能的解决办法吗?抱歉打扰了!!这是新的要求吗?;)在您下面的问题中,“那么file.txt将变成”仅显示customer1“。有人能告诉我如何锁定每个客户的特定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=