我如何sed只匹配的grep行

我只想在两个其他variables匹配的情况下replace一个variables。 例如,我在我的data.txt中有这个:

Mary Jane:Runs:Pasta Mary Jane:Kicks:Apricot John:Runs:Pasta 

而且我想只在与两个值匹配的行上replace一个variables。 假设我想让第一个variables匹配“Mary Jane”,第二个匹配“Runs”,然后将该特定行从“运行”更改为“睡眠”,所以这应该是结果:

 Mary Jane:Sleeps:Pasta Mary Jane:Kicks:Apricot John:Runs:Pasta 

但是我得到这个:

 Mary Jane:Sleeps:Pasta Mary Jane:Kicks:Apricot John:Sleeps:Pasta 

这里有两个解决方案。 一个使用sed ,另一个使用awk 。 两者都使用shell变量whowhat (这些帮助我们找到需要改变的行)。

 who="Mary Jane" what="Runs" sed "s/^$who:$what:/$who:Sleeps:/" data.in awk -vwho="$who" -vwhat="$what" -F':' \ 'BEGIN { OFS = FS } $1 == who && $2 == what { $2 = "Sleeps" } 1' data.in 

sed示例使用双引号使外壳扩展替换命令中的变量,而awk示例通过将命令行分配给Awk变量的方式将外壳变量的值传输到Awk脚本中。

你应该真的使用awk,而不是sed,因为:

 awk 'BEGIN{FS=OFS=":"} ($1=="Mary Jane") && ($2=="Runs"){$2="Sleeps"} 1' file