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
versiongnubash,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