查找特定图案后替换特定值的sed命令

查找特定图案后替换特定值的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

我有点被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(非常明显)


有人能告诉我如何锁定每个客户的特定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=