【问题标题】:in sed, how to do a pattern substitution only when another pattern doesn't exist在 sed 中,仅当另一个模式不存在时如何进行模式替换
【发布时间】:2017-12-30 21:20:06
【问题描述】:

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

【问题讨论】:

标签: vim awk sed csh


【解决方案1】:

这可能对你有用(GNU sed):

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

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

【讨论】:

  • 这里的 GNU 是什么?
  • 谢谢,其实我知道答案,但前几天在stackoverflow上找不到答案,所以提出一个问题,以便其他人可以从中获得帮助。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多