在sed中,仅当另一个模式不存在时如何进行模式替换

时间:2017-07-25 05:58:52

标签: vim awk sed csh

在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中不起作用。什么是正确的命令?

1 个答案:

答案 0 :(得分:2)

这可能适合你(GNU sed):

sed '/animal/!s/rabbit/hare/g' file

搜索animal,如果找不到,请rabbit全局替换hare