我只想在两个其他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变量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
示例使用双引号使外壳扩展替换命令中的变量,而awk
示例通过将命令行分配给Awk变量的方式将外壳变量的值传输到Awk脚本中。
你应该真的使用awk,而不是sed,因为:
awk 'BEGIN{FS=OFS=":"} ($1=="Mary Jane") && ($2=="Runs"){$2="Sleeps"} 1' file