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

Bash sed:替换包含反斜杠的文本模式,bash,shell,sed,Bash,Shell,Sed,我在sed中遇到了一个问题,我可以通过下面的简单示例重新创建该问题 考虑以下输入文件(input.txt): 我想生成以下输出 C:\Animal\ jumps over the lazy dog C:\Animal\ ran with the hounds 我尝试使用sed创建一个简单的shell脚本,但它没有执行所需的替换。这是我的剧本: FROM_PATTERN="C:\A\quick\brown\fox\" TO_PATTERN="C:\Animal\&q

我在
sed
中遇到了一个问题,我可以通过下面的简单示例重新创建该问题

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

我想生成以下输出

C:\Animal\ jumps over the lazy dog
C:\Animal\ ran with the hounds
我尝试使用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


我正在运行
bash
version
gnubash,version 4.4.12(3)-release-(x86\u 64-unknown-cygwin)
您可以使用单引号分配变量,但如果使用双引号,则需要转义两次,因为反斜杠将被解释两次:一次在分配时,一次在
sed

要在sed中展开变量,必须使用双引号

以下代码起作用:

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

sed "s/$FROM_PATTERN/$TO_PATTERN/g" input.txt
这可能适合您(GNU-sed和bash):

在bash中使用参数展开来转义后斜杠参数

注意:FROM_模式和TO_模式是单引号。

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

sed "s/$FROM_PATTERN/$TO_PATTERN/g" input.txt
FROM_PATTERN='C:\A\quick\brown\fox\'
TO_PATTERN='C:\Animal\'
sed 's/'${FROM_PATTERN//\\/\\\\}'/'${TO_PATTERN//\\/\\\\}'/g' file