Regex sed如何转义文字点
以下Regex sed如何转义文字点,regex,bash,sed,double-quotes,Regex,Bash,Sed,Double Quotes,以下sed命令 echo '.' | sed "s/\\./foo/" 如预期,用foo替换。但是,如果我们在上述命令中转义非字母数字的 echo '.' | sed "s/\\\./foo/" 仅打印,而预期打印foosed应该与字符字面上匹配,但它不匹配。我无法理解圆点发生了什么。我认为,如果字符串是双引号的,我应该在bash中的每个非字母数字字符前面加一个反斜杠。点是非字母数字字符,因此转义它有什么错,为什么会产生不同的结果?在第二个点中,仍然是一个文字点,但正则表达式仅将两个字符序列
sed
命令
echo '.' | sed "s/\\./foo/"
如预期,用foo
替换
。但是,如果我们在上述命令中转义非字母数字的
echo '.' | sed "s/\\\./foo/"
仅打印
,而预期打印foo
sed
应该与字符
字面上匹配,但它不匹配。我无法理解圆点发生了什么。我认为,如果字符串是双引号的,我应该在bash中的每个非字母数字字符前面加一个反斜杠。点是非字母数字字符,因此转义它有什么错,为什么会产生不同的结果?在第二个点中,
仍然是一个文字点,但正则表达式仅将两个字符序列\。
(而不是
本身)替换为foo
:
$ echo '=\.=' | sed "s/\\\./foo/"
=foo=
在第二个表达式中,
仍然是一个文字点,但正则表达式仅将两个字符的序列\。
(而不是
本身)替换为foo
:
$ echo '=\.=' | sed "s/\\\./foo/"
=foo=
这是因为反斜杠在bash双引号
“
转义中是如何工作的
echo "\\"
\
echo "\."
\.
echo "s/\\./foo/"
s/\./foo/
echo "s/\\\./foo/"
s/\\./foo/
从manbash
:
在双引号中,反斜杠只有在
后跟以下字符之一:$、`、\、或。
因此,在第一种情况下,sed获取s/\./foo/
,并将其解释为“用foo替换一个点”。在第二种情况下,sed获取s/\\\./foo/
,并将其解释为“用foo替换反斜杠和另一个字符”
在这种情况下,最好使用单引号转义:
echo 's/./foo/'
s/./foo/
echo 's/\./foo/'
s/\./foo/
这可能是您想要的。这是因为反斜杠在bash双引号
“
转义中是如何工作的
echo "\\"
\
echo "\."
\.
echo "s/\\./foo/"
s/\./foo/
echo "s/\\\./foo/"
s/\\./foo/
从manbash
:
在双引号中,反斜杠只有在
后跟以下字符之一:$、`、\、或。
因此,在第一种情况下,sed获取s/\./foo/
并将其解释为“用foo替换一个点”。在第二种情况下,sed获取s/\\\./foo/
并将其解释为“用foo替换一个反斜杠和另一个字符”
在这种情况下,最好使用单引号转义:
echo 's/./foo/'
s/./foo/
echo 's/\./foo/'
s/\./foo/
这可能就是你想要的。我对
s/\\\\./foo/
不起作用并不感到惊讶。我很惊讶s/\\\./foo/
能起作用。@Beta这是因为他用双引号将它括起来,因此shell使用了\\
,并将它作为一个\
传递给了sed
我并不惊讶s/\\\\\./foo/
不能起作用。我很惊讶s/\\\./foo/
确实有效。@Beta这是因为他用双引号将它包装起来,因此shell使用了\\
,并将它作为一个\
传递给sed
,这回答了我的问题,但我仍然觉得\.
或\\或逃逸有一些更微妙的东西,我不明白。我认为微妙之处在于bash
将创建\.
和\.
相同,但原因不同。由于
没有特殊含义,\.
不会被任何内容替换,因此它会原封不动地传递给sed
<代码>\确实有特殊的含义,因此\.
首先被bash
简化为\.
,然后被传递到'sed.@banan3'14-更微妙的事情与shell有关,并在shell中引用,而不是特别与sed
有关。当使用双引号而不是单引号时,shell仍会进行一些处理;它计算变量和命令,特别是它仍然将反斜杠作为转义字符。当像您那样使用双引号编写时,shell将\\
解释为一个反斜杠,这就是它呈现给sed
s
命令的内容。这就是为什么在大多数情况下,人们使用单引号而不是双引号来给出sed
命令的原因。@mathguy是正确的。这就是回答我的问题的原因,但是我仍然觉得关于\.
或\\或逃逸,总的来说,有一些更微妙的东西我不明白。我认为微妙之处在于bash
将创建\.
和\.
两者都是相同的,但原因不同。由于
没有特殊含义,\.
不会被任何内容替换,因此它会原封不动地传递给sed
<代码>\确实有特殊的含义,因此\.
首先被bash
简化为\.
,然后被传递到'sed.@banan3'14-更微妙的事情与shell有关,并在shell中引用,而不是特别与sed
有关。当使用双引号而不是单引号时,shell仍会进行一些处理;它计算变量和命令,特别是它仍然将反斜杠作为转义字符。当像您那样使用双引号编写时,shell将\\
解释为一个反斜杠,这就是它呈现给sed
s
命令的内容。这就是为什么在大多数情况下,人们使用单引号而不是双引号来给出sed
命令的原因。@mathguy是正确的。这就是为什么添加单引号的回音输出进行比较,您有my+1添加单引号的回音输出进行比较,您有my+1