【问题标题】:sed replace exact string that include bracketssed 替换包含括号的确切字符串
【发布时间】:2020-06-12 22:06:26
【问题描述】:

我正在尝试替换包含括号的确切字符串。比方说: a[aa] 转 bbb,仅举个例子。

我使用了以下正则表达式:

sed  's|\<a\[aa]\>|bbb|g' testfile

但它似乎不起作用。这可能是一些非常基本的东西,但我无法让它发挥作用,所以我将不胜感激。

【问题讨论】:

  • 你可以试试sed 's|\&lt;a\[aa]|bbb|g' testfile,右字边界需要字母、数字或_跟在]字符后面。
  • 抱歉,我的正则表达式错误,我尝试过类似 sed -i "s|\|bb|g" testfile
  • 是的,我读到 ] 不应该被转义,但即使这样也行不通
  • 那么,有没有办法用这种字符串设置单词边界?

标签: regex linux bash sed word-boundary


【解决方案1】:

您需要删除需要字母、数字或_ 以紧跟] 字符的结尾单词边界。

sed 's|\<a\[aa]|bbb|g' file

online sed demo

s="say: a[aa] to bbb, not ba[aa]"
sed 's|\<a\[aa]|bbb|g' <<< "$s"
# => say: bbb to bbb, not ba[aa]

您还可以要求非单词字符与捕获组并替换为反向引用:

sed -E 's~([^_[:alnum:]]|^)a\[aa]([^_[:alnum:]]|$)~\1bbb\2~g' file

这里,([^_[:alnum:]]|^) 将任何非单词字符或字符串开头捕获到第 1 组中,([^_[:alnum:]]|$) 匹配并捕获到第 2 组中除_、数字或字母以及\1 和 @ 之外的任何字符987654333@ 占位符在结果中恢复这些值。但是,这不允许连续匹配,因此您仍然可以在a 之前使用\&lt; 以确保安全:sed -E 's~\&lt;a\[aa]([^_[:alnum:]]|$)~bbb\1~g'。文件`。

this online demo

要强制执行空白边界,您可以使用

sed -E 's~([[:space:]]|^)a\[aa]([[:space:]]|$)~\1bbb\2~g' file

或者,在您的情况下,只是一个尾随空白边界似乎就足够了:

sed -E 's~\<a\[aa]([[:space:]]|$)~bbb\1~g' file

【讨论】:

  • 有没有办法用这种字符串做一个边界而不在 ] 之前添加任何东西?
  • @dperezg 请通过明确的口头规则或具有预期输出的几个示例字符串解释您的意思。
  • @dperezg 更新了各种常见的“单词”边界。
猜你喜欢
  • 1970-01-01
  • 2017-08-04
  • 2019-08-24
  • 2021-12-01
  • 1970-01-01
  • 2020-09-07
  • 2014-03-30
  • 1970-01-01
  • 2015-02-26
相关资源
最近更新 更多