Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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
Linux sed的一些问题_Linux_Bash_Sed - Fatal编程技术网

Linux sed的一些问题

Linux sed的一些问题,linux,bash,sed,Linux,Bash,Sed,此命令没有问题: sed -i -E '/ChannelSetting=/{:loop /\\/{s/\\//g;N;bloop};s/(ChannelSetting=).*/\1/}' build_config/resource.properties 但是这个命令将出现在“sed:-e表达式#1,char 30:Unmatched{”: 造成错误的“和”有什么区别? 谢谢在第二种情况下,转义字符“\”由shell解释。 使用echo命令了解差异: >> echo "/Channe

此命令没有问题:

sed -i -E '/ChannelSetting=/{:loop /\\/{s/\\//g;N;bloop};s/(ChannelSetting=).*/\1/}' build_config/resource.properties
但是这个命令将出现在“sed:-e表达式#1,char 30:Unmatched{”:

造成错误的“和”有什么区别?
谢谢

在第二种情况下,转义字符“\”由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/}'

这是Bash shell loog在这两个输出之间的差异:

root@Server:~# echo "\\"
\
root@Server:~# echo '\\'
\\
“”中的反斜杠引用下一个字符,“”中的反斜杠只是一个反斜杠

顺便说一句,VAR也是如此:

root@Server:~# XX=12
root@Server:~# echo "$XX"
12
root@Server:~# echo '$XX'
$XX

检查一下,你会明白两者的区别。谢谢,我已经解决了这个问题。好的,很高兴知道@Mark
root@Server:~# XX=12
root@Server:~# echo "$XX"
12
root@Server:~# echo '$XX'
$XX