我如何只匹配匹配的grep线

时间:2017-01-15 04:05:11

标签: shell unix sed grep sh

我想仅在两个其他变量匹配时替换变量。例如,我在data.txt中有这个:

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

我想只在与两个值匹配的行上替换一个变量。假设我希望第一个变量匹配“Mary Jane”,第二个变量匹配“Runs”,然后将该特定行从“Runs”更改为“Sleep”,这应该是结果:

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

但我得到了这个:

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

这是两个解决方案。一个使用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示例使用双引号来使shell扩展替换命令中的变量,而awk示例通过以下方式将shell变量的值传输到Awk脚本中在命令行上将它们分配给Awk变量。