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']

相關內容