sed/bash 区别对待左右方括号

Cit*_*ght 5 shell bash sed quoting

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

[root@server list]# cat filenames.txt
[AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB]
[root@qa4app01 list]#
Run Code Online (Sandbox Code Playgroud)

我想这是一个名单,我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]#
Run Code Online (Sandbox Code Playgroud)

它起作用了,我能够]']. 因此,因为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]#
Run Code Online (Sandbox Code Playgroud)

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

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

奇怪的。看起来好像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:为了安全起见,我决定使用带有两个括号的转义字符,但要绝对确保如果我不在我所在的地方使用转义字符(出于可读性原因),它不会破坏脚本仅使用右方括号 ]

Arc*_*mar 6

[引入一个字符类]关闭它。

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

仅使用[(没有结束])会混淆sed,因此必须对其进行转义。

附带说明一下,不需要

  • g (全局)标志(每行只有一个替换)
  • 换位逃生[

我管理你的变化

sed -e "s/]/']/" -e "s/\[/['/" 
Run Code Online (Sandbox Code Playgroud)