Sed 命令转义:为什么单引号和双引号不一致?

问题描述 投票:0回答:1

我在使用

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”。

我知道双引号

""
可以处理一些特殊的转义字符,而单引号
''
忽略所有特殊处理。然而,我不清楚这种机制如何导致观察到的行为。任何对此问题的见解将不胜感激。谢谢!

linux shell
1个回答
0
投票

您面临的问题与 一般(以及许多编程语言)如何在 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)关于嵌套的评论是在我回答之前发布的,它是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.