Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex sed如何转义文字点_Regex_Bash_Sed_Double Quotes - Fatal编程技术网

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