sed:替换包含反斜杠的文本模式

San*_*eep 2 bash sed shell-script

我有一个问题sed,我可以使用以下简单示例重新创建。

考虑以下输入文件 ( input.txt ):

C:\A\quick\brown\fox\ jumps over the lazy dog
C:\A\quick\brown\fox\ ran with the hounds
Run Code Online (Sandbox Code Playgroud)

我想生成以下输出

C:\Animal\ jumps over the lazy dog
C:\Animal\ ran with the hounds
Run Code Online (Sandbox Code Playgroud)

我尝试使用 sed 创建一个简单的 shell 脚本,但它没有执行所需的替换。这是我的脚本:

FROM_PATTERN="C:\A\quick\brown\fox\"
TO_PATTERN="C:\Animal\"

#FROM_PATTERN="C:\\A\\quick\\brown\\fox\\"       # Escaping backslash does not help either
#TO_PATTERN="C:\\Animal\\"       # Escaping backslash does not help either


sed 's/$FROM_PATTERN/$TO_PATTERN/g' input.txt
#sed 's/"$FROM_PATTERN"/"$TO_PATTERN"/g' input.txt       # Quoting the pattern does not help either
Run Code Online (Sandbox Code Playgroud)

我正在运行bash版本GNU bash, version 4.4.12(3)-release-(x86_64-unknown-cygwin)

Sté*_*las 5

\ 很特别:

  • 作为 shell 中的引用运算符,包括在双引号内,它可用于对自身进行转义"$`和继续行。
  • 作为正则表达式运算符(既用于逸出并引入新的经营者)上的左侧(图案)侧s在命令sed
  • s sed命令的替换部分,它可以转义&、自身和换行符(或\n在某些sed实现中引入 C 风格的转义序列)。

另请注意,shell 参数扩展不在单引号字符串中执行。

所以在这里,你想要:

  • \字符周围使用单引号而不是双引号
  • \s命令的左侧和右侧转义
  • 在必须扩展变量的部分使用双引号。
from_regexp='C:\\A\\quick\\brown\\fox\\'
escaped_replacement='C:\\Animal\\'
sed "s/$from_regexp/$escaped_replacement/g" < your-file
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用perl代替sed固定字符串替换的地方,而不必担心特殊字符,如果您这样做:

from='C:\A\quick\brown\fox\'
to='C:\Animal\'

FROM=$from TO=$to perl -pe 's/\Q$ENV{FROM}\E/$ENV{TO}/g' < your-file
Run Code Online (Sandbox Code Playgroud)

另请参阅如何确保插入到 `sed` 替换中的字符串转义所有元字符以处理任意字符串。