在sed中,当一行不包含某种模式时,如何进行模式替换? 我知道如何在vi或vim中做到这一点 例如,当该行不包含“动物”时将“兔子”替换为“野兔”,我可以做到
:g!/animal/s/rabbit/hare/g
我想对使用foreach,find和sed的目录下的数百个文件做同样的事情。当该行不包含'=(Dtype)'时,我想替换'Dtype val1 = expression;' 'Dtype val1 =(Dtype)(表达式);'。但排除“Dtype * pval = expression;”之类的情况。也就是说,我想把(Dtype)转换为非指针赋值。我试过了
>foreach i (`find . -name \*.c`)
? sed -e 'g!/ = (Dtype)/s/Dtype \([a-z].*\) = \(.*\);/Dtype \1 = (Dtype)(\2);/g' $i >! tmp
? mv tmp $i
? end
但这个'g!/ pattern / s / patter1 / pattern2 / g'在sed中不起作用。什么是正确的命令?
答案 0 :(得分:2)
这可能适合你(GNU sed):
sed '/animal/!s/rabbit/hare/g' file
搜索animal
,如果找不到,请rabbit
全局替换hare
。