一些麻烦与sed

时间:2014-12-22 06:08:42

标签: linux bash sed

此命令没有问题:

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

与“和”导致错误的区别是什么? 感谢

2 个答案:

答案 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。

通常你需要混合两种类型的字符串分隔符:

  • ' (特殊字符为' \')
  • " (为了解释一些shell变量):

示例:

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