【问题标题】:Replacing Text with Special Characters in sed - Whole Word Only用 sed 中的特殊字符替换文本 - 仅限整个单词
【发布时间】:2014-10-13 00:58:09
【问题描述】:

我想使用 sed 编辑器读取文件并替换所有 字符串 XYZ$xyz$ 的出现次数。如果XYZ$ 我只想这样做 是一个完整的单词,如果它嵌入到另一个字符串中则不是。

我尝试了以下方法,但没有成功:

sed -c -i "s/\bXYZ\$\b/xyz\$/g" file1.txt

也许\$ 没有被解释为文字美元符号,可能是因为它位于一对\b 内(用于表示单词边界)。有什么建议吗?

【问题讨论】:

  • 要替换的文本可以在一行的任何位置。所以我想将行:123 XYZ$ 456 替换为行:123 xyz$ 456 所以我想使用单词边界选项。
  • 您使用的是哪个版本的sed?虽然 GNU sed 支持 \b,但并非所有版本的 sed 都支持。

标签: regex sed


【解决方案1】:

$ 之后不能匹配 \b,因为它不被视为单词字符。

你可以使用这个 sed:

sed -i 's/\bXYZ\$/xyz$/g' file

如果您想确保$ 之后总是有一个非单词字符,请使用:

sed -ir 's/\bXYZ\$([^[:alnum:]]|$)/xyz$\1/g' file

【讨论】:

  • 是否需要\\$ 转义$XYZ$ABC呢?
  • 单引号中不需要\\$
  • 所以需要在双引号中作为OP使用它。
  • 这里不需要双引号,最好使用单引号来避免意外的shell扩展。
  • 很高兴知道它成功了,您能否通过单击我的答案左上角的勾号将答案标记为已接受。
【解决方案2】:

尝试使用:

"s/\bXYZ\b\$ /xyz\$ /g"

单词字符是 [a-zA-Z0-9_],因此 $ 永远不会在边界 (\b) 内匹配。

所以结束你的边界,检查以确保 $ 是下一个字符,后跟一个空格。

输入:

This xyz$ is unchanged.
This XYZ$is unchanged
This XYZ$ is changed.

输出:

This xyz$ is unchanged.
This XYZ$is unchanged
This xyz$ is changed.

【讨论】:

  • 如果XYZ$ 在行/字符串的末尾会怎样?
猜你喜欢
  • 2019-09-07
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多