Bash

sed/bash 對左右方括號的處理方式不同

  • November 16, 2014

我有一個包含以下內容的文件:

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

我希望將此作為列表在我的 python 腳本中使用,所以我試圖更改AAA''AAA''BBBto '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 腳本,它將處理帶有大量方括號實例的文件。我的問題是左右方括號是否被sedor區別對待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']

引用自:https://unix.stackexchange.com/questions/168240