
我有一個包含以下內容的文件:
[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']