我有一个包含以下内容的文件:
[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 脚本,该脚本将处理具有大量方括号实例的文件。我的问题是sed
or是否对左右方括号进行不同的处理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']