【问题标题】:Changing text between possible keywords in bash script using sed使用 sed 更改 bash 脚本中可能的关键字之间的文本
【发布时间】:2019-05-15 18:47:34
【问题描述】:

我的input 文件有一些需要更改的文本。例如,它有几种可能性;

CONSTANT change/me !KEY2 !KEY3
CONSTANT change/me 
CONSTANT change/me !DIFFERENTKEY

总是有一个不变的键(即CONSTANT)不会改变。在需要替换的文本之后还存在不同关键字的可能性。这些用感叹号 (!) 表示,可能没有其他关键字或数千个。我只对替换CONSTANT 之后的文本以及以! 开头的任何可能的键感兴趣。最好使用sed

以下是我的预期输出。 input中的change/me必须替换为changed

CONSTANT changed !KEY2 !KEY3
CONSTANT changed 
CONSTANT changed !DIFFERENTKEY

我在 SO 上的答案(hereherehere)中尝试了不同的东西,但我似乎无法弄清楚。我最接近的来自this链接。

sed -r 's/(^CONSTANT) (.+?) (\!.*$)/\1 changed \3/g' input

结果;

CONSTANT changed !KEY2
CONSTANT change/me
CONSTANT changed !DIFFERENTKEY

我尝试了不同的组合,但此时感觉就像我只是在黑暗中拍摄。

条件:

  • CONSTANT 不变
  • change/me 是任意文本也可以是 blahblah 需要更换
  • !KEY 不一定是 呈现
  • !KEY 可以存在并且可以是多个,但是 总是用空格隔开。我想维护CONSTANT 和任何 可能!KEYs。

【问题讨论】:

  • 请务必在您的帖子中提及我们应该获得此输出的条件。
  • 如果's/\/me//' 不是您所需要的,那么请明确您的要求并提供更好的示例输入/输出来满足您的实际需求。
  • 什么意思? sed 会很有用
  • 我很困惑如何使它更清楚。好吧,我先考虑一下并删除...
  • @tstev,告诉我们你获得输出的条件应该足够了。

标签: bash shell unix sed


【解决方案1】:

第三个(\!*.*$)被强制以!开头,第2行不匹配。

注意(.+?) (\! ... 使sed 搜索(.+?) 的最长序列直到!...,这就是!KEY2 丢失的原因。

强制:change/me 永远不会包含 !,以便下面的解决方案起作用。

试试这个:

sed -r 's/(^CONSTANT) ([^!]+?) *(\!.*|.*)$/\1 changed \3/g' input

输出

CONSTANT changed !KEY2 !KEY3
CONSTANT changed 
CONSTANT changed !DIFFERENTKEY

【讨论】:

  • 感谢您的解释。至少现在我不会失去!KEY2。但它不适用于第二行。它仍然是CONSTANT change/me
  • @tstev 我刚刚更新了答案,它在我的测试中有效。或许你可以刷新一下看看
  • 太棒了,也有效!也非常感谢您的解释。
  • 这可能无关紧要,但这会在没有键的行中添加一个尾随空格
【解决方案2】:

不必费心处理整行,要更改的文本之后是否出现附加内容无关紧要:

sed 's@^CONSTANT change/me@CONSTANT changed@'

我使用@ 作为分隔符而不是通常的/,以避免在change/me 中转义/

你可以try it here

如果change/me 文本不同但从不包含空格,您可以改用以下内容:

sed -E 's@^CONSTANT [^ ]+@CONSTANT changed@'

(对于旧版本的 GNU sed,您需要使用 -r 标志而不是 -E

你可以try it here

【讨论】:

  • change/me 只是一个随机文本。也可能是pleasechangeblahblah
  • @tstev 是的,我最终得到了这个;第二个解决方案将替换CONSTANT 之后的非空格字符序列?
  • 这似乎有效,我维护我的 !KEY s。谢谢!
  • @ 提示也很有用,以防我需要将其更改为不同的绝对路径。
猜你喜欢
  • 2021-12-18
  • 2017-04-03
  • 2014-03-21
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 2013-04-30
相关资源
最近更新 更多