我在使用
sed
命令进行正则表达式替换时遇到问题。具体来说,我在转义单引号和双引号内的字符时遇到问题。
我注意到当我使用命令时:
echo "earth" | sed 's/\(ear\)$/\1md/g'
替换按预期进行,将“earth”转换为“earmd”。
但是,当我尝试使用时:
sh -c "echo "earth" | sed "s/\(ear\)th$/\1md/g""
或
sh -c 'echo "earth" | sed 's/\(ear\)th$/\1md/g''
我遇到错误:
sh: 1: Syntax error: "(" unexpected
有趣的是,如果我使用:
sh -c 'echo "earth" | sed "s/\(ear\)th$/\1md/g"'
或
sh -c "echo "earth" | sed 's/\(ear\)th$/\1md/g'"
替换按预期进行,将“earth”转换为“earmd”。
我知道双引号
""
可以处理一些特殊的转义字符,而单引号''
忽略所有特殊处理。然而,我不清楚这种机制如何导致观察到的行为。任何对此问题的见解将不胜感激。谢谢!
您面临的问题与 一般(以及许多编程语言)如何在 bash 中处理引号有关,不是专门的 sed 问题。
我将使用您收到错误的第一个示例作为参考:
sh -c "echo "earth" | sed "s/\(ear\)th$/\1md/g""
执行上述操作的正确方法是:
sh -c "echo 'earth' | sed 's/\(ear\)th$/\1md/g'"
说明:您遇到的问题是
sh -c "echo
处的双引号的第一次打开被
"earth
处的双引号关闭。然后,新的引用段由
earth"
处的双引号打开,并由
sed "s
处的双引号关闭。这使得文本
s/\(ear\)th$/\1md/g
不被引用,最后,您有一个左双引号和右双引号来结束该行,
1md/g""
。在我提供的替代方案中,双引号以
sh -c "echo
开始,以
1md/g'"
结束。在内部,
'earth'
用单引号括起来,
's/\(ear\)th$/\1md/g'
用单引号括起来。通过在外部使用双引号并在内部使用单引号,可以避免意外打开/关闭双引号。致谢:蒂姆·罗伯茨(Tim Roberts)关于嵌套的评论是在我回答之前发布的,它是正确的。