【问题标题】:Search lines with matching Pattern in File but replace string matching with second pattern in same line在文件中搜索具有匹配模式的行,但用同一行中的第二个模式替换匹配的字符串
【发布时间】:2018-09-01 06:24:21
【问题描述】:

需要 Shell/Bash Geeks 的帮助,尤其是在 Mac OS 上

我想在一堆源文件中搜索一个模式,但想替换具有该模式的行中的另一个字符串。

例如:

Private const String myTestString = @“VAL15”; // STRING-REPLACE-VAL##

在这里,我想在我的源文件中搜索模式“STRING-REPLACE-VAL##”,然后将 VAL15 替换为 VAL20。

输出:

private const String myTestString = @“VAL20”; // STRING—REPLACE-VAL##

尝试了下面的命令,但没有按预期工作。

sed -i '.bkp' '/,STRING—REPLACE-VAL##/ {; s/,VAL15,/,VAL20,/;}' myTestFile.cpp

Q2 - 是否可以搜索STRING—REPLACE-VAL##,然后在同一行中搜索匹配模式@"VAL??",并将15 替换为20

sed 很容易支持搜索和替换相同的模式,但不确定 sed 是否支持搜索模式但替换匹配行中的另一个字符串?

任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 请将您的示例包装在代码标签中,并更准确地说明您的要求。
  • 上述帖子中的共享命令,即“sed -i '.bkp' '/,STRING-REPLACE-VAL##/ {; s/,VAL15,/,VAL20,/;}' myTestFile。 cpp”,但不允许编辑相同的内容。
  • 请注意,当您在 SO 中输入或编辑问题时,您会在下方看到预览。还有一个带有帮助图标的黄色栏,让您知道如何进行格式化等。
  • Stack Overflow 不是代码编写服务。请出示您的代码。由于 Stack Overflow 向您隐藏了关闭原因:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example
  • @jww -- 刚刚遇到这个 -- 虽然 OP 没有正确格式化文本(请注意,这是他们的第一篇文章),但他们确实提到了一个具体问题,所需的行为,并显示了尝试解决无效的问题。

标签: bash macos shell awk sed


【解决方案1】:

你可以用一些简单的方法来做到这一点,像这样:

sed -i 's/VAL15\(.*STRING-REPLACE-VAL\)/VAL20\1/'

如果一行包含VAL15,后跟STRING-REPLACE-VAL,它将用VAL20 替换VAL15

如果不能保证订单,当然可以变得更复杂:

sed -E '/STRING-REPLACE-VAL/bx ; b ; :x ; s/VAL15/VAL20/ ;'

请注意,; 是 GNU 特定的,可能无法在所有平台上运行(我相信您可以在其他平台上使用 -e 代替)。该语句基本上是说:如果该行匹配STRING-REPLACE-VAL,则分支到标签:x,否则分支到最后。如果你去标签x:,那么运行s/VAL15/VAL20就行了。请参阅here 以获取参考

【讨论】:

  • 成功了。 Stackoverflow 开发者社区摇滚 :-)
  • sed -i '.bkp' 's/VAL15(.*STRING-REPLACE-VAL)/VAL20\1/' myTestFile.cpp
猜你喜欢
  • 1970-01-01
  • 2013-04-03
  • 2021-04-02
  • 2017-10-09
  • 2022-01-02
  • 2013-06-23
  • 1970-01-01
  • 2011-06-28
  • 2013-07-11
相关资源
最近更新 更多