Shell-Script

在 sh 腳本中使用 sed 時需要轉義哪些字元?

  • March 1, 2020

採取以下腳本:

#!/bin/sh
sed 's/(127\.0\.1\.1)\s/\1/' [some file]

如果我嘗試在sh( dashhere) 中執行它,它會因為需要轉義的括號而失敗。但我不需要自己轉義反斜杠(在八位字節之間,或在\sor中\1)。這裡有什麼規則?什麼時候我需要使用{...}or [...]?有沒有我做什麼和不需要逃跑的清單?

這裡有兩個層次的解釋:shell 和 sed。

在 shell 中,單引號之間的所有內容都按字面意思解釋,除了單引號本身。您可以通過編寫有效地在單引號之間使用單引號'\''(關閉單引號,一個文字單引號,打開單引號)。

Sed 使用基本的正則表達式。在 BRE 中,為了使它們按字面意思處理,除了字元集 ( )$.*[\^內部之外,需要在字元前面加上反斜杠來引用它們。不能引用[…]字母、數字(你可以在某些實現中引用其中的一些)。(){}+?|序列\(, \), \n, 和在某些實現\{中 , \}, \+,\?\|其他反斜杠+字母數字具有特殊含義。在某些實現中,您可以不引用$^某些位置而僥倖逃脫。

/此外,如果要出現在括號表達式之外的正則表達式中,您需要一個反斜杠。您可以通過書寫選擇替代字元作為分隔符,例如,s~/dir~/replacement~\~/dir~p;如果要將分隔符包含在 BRE 中,則需要在分隔符之前添加反斜杠。如果您選擇一個在 BRE 中具有特殊含義的字元,並且您想按字面意思包含它,則需要三個反斜杠;我不推薦這樣做,因為它在某些實現中可能表現不同。

簡而言之,對於sed 's/…/…/'

  • 在單引號之間寫正則表達式。
  • 用於'\''在正則表達式中以單引號結尾。
  • 只在那些字元之前加上反斜杠$.*/[\]^(但不在括號表達式內)。(從技術上講,您不應該在前面加上反斜杠,]但我不知道在括號表達式之外處理]和不同的實現。)\]
  • 在括號表達式中,-要按字面意思對待,請確保它是第一個或最後一個([abc-][-abc],不是[a-bc])。
  • 在括號表達式中,^要按字面意思對待,請確保它不是第一個(使用[abc^],不是[^abc])。
  • 要包含]在與括號表達式匹配的字元列表中,請將其設為第一個字元(或^否定集的第一個字元):[]abc][^]abc](not [abc]]nor[abc\]])。

在替換文本中:

  • &並且\需要通過在它們前面加上反斜杠來引用,分隔符(通常/)和換行符也是如此。
  • \後面跟一個數字有特殊含義。\後跟一個字母在某些實現中具有特殊含義(特殊字元),而\後跟一些其他字元意味著\cc取決於實現。
  • 在參數 ( sed 's/…/…/') 周圍使用單引號,用於'\''在替換文本中放置單引號。

如果正則表達式或替換文本來自 shell 變數,請記住

  • 正則表達式是 BRE,而不是文字字元串。
  • 在正則表達式中,換行符需要表示為(除非您有其他程式碼將換行符添加到模式空間,\n否則它永遠不會匹配)。sed但請注意,它不適用於某些sed實現的括號表達式。
  • 在替換文本中,&需要\引用 和換行符。
  • 分隔符需要被引用(但不是在括號表達式內)。
  • 使用雙引號進行插值:sed -e "s/$BRE/$REPL/".

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