命令替换中的 sed 单引号命令的双反斜杠被转换为单个反斜杠
double backslashes of sed single-quoted command inside command substitutions get translated to a single backslash
printf '%s' 'abc' | sed 's/./\&/g' #1, \a\b\c
printf '%s' "`printf '%s' 'abc' | sed 's/./\&/g'`" #2, &&&
第二个反引号里面的表达式returns\a\b\c
,我们有printf '%s' "\a\b\c"
,所以它应该打印\a\b\c
。
我的问题是:为什么第二个脚本打印 &&&
?
注意:
我可以通过在每个反斜杠前面加上另一个反斜杠来使第二个脚本工作(打印 \a\b\c
),但我不知道为什么需要它。
一个相关问题:
因为在第二行:
你是说:
printf '%s' 'abc' -> 'abc'
然后替换为:
'abc'| sed 's/./\&g' -> &&&
The s mean substitute
. mean one character
\& by a char &
g mean multiple occurrence on the line
所以你是说:
在同一行多次用 & 替换 abc 中的每个字符
\\&
的解释:
Two backslashes become a single backslash in the shell which then in sed escapes the forward slash which is the middle delimiter.
\& -> \& (which makes the forward & a regular character instead of a delimiter)
Three of them: The first two become one in the shell which then escape the third one in sed
\\& -> \&
终于!不要忘记你的命令在 backquote:
下
您必须对其进行转义的原因 "twice" 是因为您在一个只解释一次双引号字符串的环境(例如 shell 脚本)中输入此命令。然后它被 subshell.
再次解释
发件人:
Why does sed require 3 backslashes for a regular backslash?
这是显示反引号和 $(cmd)
命令替换之间区别的一个很好的例子。
When the old-style backquoted form of substitution is used, backslash
retains its literal meaning except when followed by "$", "`", or "\".
The first backticks not preceded by a backslash terminates the command
substitution. When using the "$(COMMAND)" form, all characters between
the parentheses make up the command; none are treated specially.
http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html
所以看看你的例子,我用 echo
而不是 printf
:
kent$ echo 'abc' | sed 's/./\&/g'
\a\b\c
kent$ echo -E "`echo 'abc' | sed 's/./\&/g'`"
&&&
kent$ echo -E "$(echo 'abc' | sed 's/./\&/g')"
\a\b\c
您可以看到,反引号命令替换使您的 \
成为单个 \
,因此与后面的 &
一起变成了 \&
(字面 &
)
请注意,我使用 echo -E
来禁用反斜杠转义的解释,以便可以打印出 \a\b\c
。
printf '%s' 'abc' | sed 's/./\&/g' #1, \a\b\c
printf '%s' "`printf '%s' 'abc' | sed 's/./\&/g'`" #2, &&&
第二个反引号里面的表达式returns\a\b\c
,我们有printf '%s' "\a\b\c"
,所以它应该打印\a\b\c
。
我的问题是:为什么第二个脚本打印 &&&
?
注意:
我可以通过在每个反斜杠前面加上另一个反斜杠来使第二个脚本工作(打印 \a\b\c
),但我不知道为什么需要它。
一个相关问题:
因为在第二行:
你是说:
printf '%s' 'abc' -> 'abc'
然后替换为:
'abc'| sed 's/./\&g' -> &&&
The s mean substitute
. mean one character
\& by a char &
g mean multiple occurrence on the line
所以你是说:
在同一行多次用 & 替换 abc 中的每个字符
\\&
的解释:
Two backslashes become a single backslash in the shell which then in sed escapes the forward slash which is the middle delimiter.
\& -> \& (which makes the forward & a regular character instead of a delimiter)
Three of them: The first two become one in the shell which then escape the third one in sed
\\& -> \&
终于!不要忘记你的命令在 backquote:
下您必须对其进行转义的原因 "twice" 是因为您在一个只解释一次双引号字符串的环境(例如 shell 脚本)中输入此命令。然后它被 subshell.
再次解释发件人:
Why does sed require 3 backslashes for a regular backslash?
这是显示反引号和 $(cmd)
命令替换之间区别的一个很好的例子。
When the old-style backquoted form of substitution is used, backslash retains its literal meaning except when followed by "$", "`", or "\". The first backticks not preceded by a backslash terminates the command substitution. When using the "$(COMMAND)" form, all characters between the parentheses make up the command; none are treated specially.
http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html
所以看看你的例子,我用 echo
而不是 printf
:
kent$ echo 'abc' | sed 's/./\&/g'
\a\b\c
kent$ echo -E "`echo 'abc' | sed 's/./\&/g'`"
&&&
kent$ echo -E "$(echo 'abc' | sed 's/./\&/g')"
\a\b\c
您可以看到,反引号命令替换使您的 \
成为单个 \
,因此与后面的 &
一起变成了 \&
(字面 &
)
请注意,我使用 echo -E
来禁用反斜杠转义的解释,以便可以打印出 \a\b\c
。