我想仅在两个其他变量匹配时替换变量。例如,我在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
答案 0 :(得分:2)
你应该真的使用awk而不是sed:
awk 'BEGIN{FS=OFS=":"} ($1=="Mary Jane") && ($2=="Runs"){$2="Sleeps"} 1' file
答案 1 :(得分:0)
这是两个解决方案。一个使用sed
,另一个使用awk
。两者都使用shell变量who
和what
(这些有助于我们找到需要更改的行)。
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变量。