sed/bash 對左右方括號的處理方式不同
我有一個包含以下內容的文件:
[root@server list]# cat filenames.txt [AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB] [root@qa4app01 list]#
我希望將此作為列表在我的 python 腳本中使用,所以我試圖更改
AAA'
為'AAA'
和'BBB
to'BBB'
,我想我會使用sed
和替換[
with['
和]
with']
。為了確認,我嘗試了這個:
[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:為了安全起見,我決定在兩個括號中都使用轉義字元,但要絕對確定如果我不在我將要使用的地方使用轉義字元(出於可讀性原因)它不會破壞腳本僅使用右方括號
]
[
引入一個字元類並]
關閉它。如果 sed 只看到
]
(即關閉命令),就可以了,sed 假定這不是特殊命令。僅使用
[
(沒有關閉]
)會混淆sed
,因此必須對其進行轉義。順便說一句,沒有必要
g
(全域)標誌(每行只有一個替換)- 代替逃跑
[
。我用
sed -e "s/]/']/" -e "s/\[/['/"
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']