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

in sed, how to do a pattern substitution only when another pattern doesn't exist

在 sed 中,当一行不包含特定模式时,如何进行模式替换?
我知道如何在 vi 或 vim.
中完成 例如,要在行中不包含 'animal' 时将 'rabbit' 替换为 'hare',我可以执行

:g!/animal/s/rabbit/hare/g

我想使用 foreach、find 和 sed 对目录下的数百个文件执行相同的操作。当该行不包含'=(Dtype)'时,我想将'Dtype val1 = expression;'替换为'Dtype val1 = (Dtype)(expression);'。但不包括像 'Dtype *pval = expression;' 这样的情况。也就是说,我想对非指针赋值进行 (Dtype) 转换。我试过了

>foreach i (`find . -name \*.c`)
? sed -e 'g!/ = (Dtype)/s/Dtype \([a-z].*\) = \(.*\);/Dtype  = (Dtype)();/g' $i >! tmp
? mv tmp $i
? end

但是这个 'g!/pattern/s/patter1/pattern2/g' 在 sed 中不起作用。正确的命令是什么?

这可能适合您 (GNU sed):

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

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