此命令没有问题:
sed -i -E '/ChannelSetting=/{:loop /\\/{s/\\//g;N;bloop};s/(ChannelSetting=).*/\1/}' build_config/resource.properties
但是这个命令将发生“sed:-e expression#1,char 30:Unmatched {”:
sed -i -E "/ChannelSetting=/{:loop /\\/{s/\\//g;N;bloop};s/(ChannelSetting=).*/\1/}" build_config/resource.properties
与“和”导致错误的区别是什么? 感谢
答案 0 :(得分:1)
在第二种情况下,转义字符' \'由shell解释。 使用echo命令来理解差异:
>> echo "/ChannelSetting=/{:loop /\\/{s/\\//g;N;bloop};s/(ChannelSetting=).*/\1/}"
/ChannelSetting=/{:loop /\/{s/\//g;N;bloop};s/(ChannelSetting=).*/\1/}
请注意' \'每次出现时只出现一次:您的shell将缺失的那些解释为转义字符。所以sed命令只接收第二个' \'每次出现。
>> echo '/ChannelSetting=/{:loop /\\/{s/\\//g;N;bloop};s/(ChannelSetting=).*/\1/}'
/ChannelSetting=/{:loop /\\/{s/\\//g;N;bloop};s/(ChannelSetting=).*/\1/}
如您所见,在第二种情况下,所有字符都按原样发送到sed。
通常你需要混合两种类型的字符串分隔符:
示例:
myMatch='ChannelSetting='
sed -i -E "/$myMatch/"'{:loop /\\/{s/\\//g;N;bloop};s/('$myMatch').*/\1/}'
答案 1 :(得分:1)
这是Bash-shell的行为,在这两个输出的差异上徘徊:
root@Server:~# echo "\\"
\
root@Server:~# echo '\\'
\\
“”中的反斜杠引用下一个字符,''中的反斜杠只是反斜杠。
顺便说一下,vars也一样:
root@Server:~# XX=12
root@Server:~# echo "$XX"
12
root@Server:~# echo '$XX'
$XX