在 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
。
在 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
。