【问题标题】:Removing first square brackets in every line with the content in it (bash) [duplicate]删除每行中的第一个方括号及其内容(bash)[重复]
【发布时间】:2018-05-28 18:41:18
【问题描述】:

我有一个文件try.txt,看起来像这样:

(SOME_PRINT): [a] content
(SOME_PRINT): [a] [b] content

如果我在文件的行首有这个模式:(SOME_PRINT): [<word>](其中<word> 只是字母和数字的组合),所以我想用(OTHER_PRINT): 替换它。
对于上面的文件,我想找一个命令,它的执行会使文件变成:

(OTHER_PRINT): content
(OTHER_PRINT): [b] content      

我尝试运行 sed -r -i 's/^\(SOME_PRINT\)\: \[.*\] /\(OTHER_PRINT\)\: /' try.txt ,得到以下输出:

(OTHER_PRINT): content
(OTHER_PRINT): content               

你能解释一下为什么[b] 消失了吗?

【问题讨论】:

  • 请注意,sed 不支持非贪婪,但如重复问题的答案中所指定,您可以在这种情况下使用解决方法.. 此外,您可以避免转义 @987654330 @ 通过删除 -r 选项

标签: linux bash sed


【解决方案1】:

只需像这样更改您的正则表达式:

sed -r -i 's/^\(SOME_PRINT\)\: \[[a-zA-Z0-9]\] /\(OTHER_PRINT\)\: /' try.txt

您的错误是您的这部分正则表达式不够精确:\[.*\]

[a] [b] 可以被\[.*\] 捕获

解决方案是仅指定方括号之间可以找到的字符。正如你所说的只有字母数字字符,这可以通过这个选择器来完成:[a-ZA-Z0-9]

另一种解决方案是从字符中排除右方括号。

我经常使用https://regex101.com/ 尝试我的正则表达式。这非常酷且易于理解。

【讨论】:

  • 感谢您提供有用的链接。
猜你喜欢
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2016-11-14
相关资源
最近更新 更多