sed/bash 对左方括号和右方括号的处理方式不同

sed/bash 对左方括号和右方括号的处理方式不同

我有一个包含以下内容的文件:

[root@server list]# cat filenames.txt
[AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB]
[root@qa4app01 list]#

我希望将其作为列表在我的 python 脚本中使用,因此我尝试更改AAA''AAA''BBB'BBB'并且我想我会使用sed和替换[['和。]']

为了确认,我尝试了这个:

[root@server list]# cat filenames.txt | sed "s/]/']/g"
[AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','MENSCOGH','TESTENT','DORASINE','LOKAWINK','BBB']
[root@server list]#

它有效,我能够]'].因此,AAA我只需要更改将右方括号和 sed 中的单引号替换为左方括号,然后尝试以下操作:

[root@server list]# cat filenames.txt | sed -e "s/]/']/g" -e "s/[/['/g"
sed: -e expression #2, char 8: unterminated `s' command
[root@server list]#

好的。我认为由于某种原因附加sed命令无法正常工作,为了检查这一点,我sed分别尝试了左方括号:

[root@server list]# cat filenames.txt | sed  "s/[/['/g"
sed: -e expression #1, char 8: unterminated `s' command
[root@server list]#

奇怪的。看起来好像sed对左括号和方括号的处理方式不同。我能够在不转义的情况下逃脱[,而拒绝在没有转义字符的情况下sed使用。]我最终得到了我想要的结果,在左方括号中添加转义字符,如下所示:

[root@server list]# cat filenames.txt | sed -e "s/]/']/g" -e "s/\[/\['/g" ['AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','MENSCOGH','TESTENT','DORASINE','LOKAWINK','BBB'] [root@server list]#

我正在编写一个 python + shell 脚本,该脚本将处理具有大量方括号实例的文件。我的问题是sedor是否对左右方括号进行不同的处理bash

sed 版本是 GNU sed 版本 4.2.1。

PS:为了安全起见,我决定在括号中使用转义字符,但要绝对确定如果我在我将要出现的地方不使用转义字符(出于可读性原因),它不会破坏脚本仅使用右方括号]

答案1

[介绍了一个字符类]关闭它。

如果 sed 只看到](即关闭命令),那就没问题,sed 假定这不是特殊命令。

仅使用[(不带结束语])会造成混淆sed,因此必须对其进行转义。

顺便说一句,没有必要

  • g(全局)标志(每行只有一个替换)
  • [替换中逃脱。

我管理你的改变

sed -e "s/]/']/" -e "s/\[/['/" 

答案2

Archemar 解释了为什么这在 上失败[,这是进行此特定替换的另一种方法:

$ sed "s/^./['/;s/.$/']/" file
['AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB']

或者,使用&which表示“无论你刚刚匹配什么”:

$ sed "s/^./&'/;s/.$/'&/" file
['AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB']

相关内容