Shell-Script
在 sh 腳本中使用 sed 時需要轉義哪些字元?
採取以下腳本:
#!/bin/sh sed 's/(127\.0\.1\.1)\s/\1/' [some file]
如果我嘗試在
sh
(dash
here) 中執行它,它會因為需要轉義的括號而失敗。但我不需要自己轉義反斜杠(在八位字節之間,或在\s
or中\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\]]
)。在替換文本中:
&
並且\
需要通過在它們前面加上反斜杠來引用,分隔符(通常/
)和換行符也是如此。\
後面跟一個數字有特殊含義。\
後跟一個字母在某些實現中具有特殊含義(特殊字元),而\
後跟一些其他字元意味著\c
或c
取決於實現。- 在參數 (
sed 's/…/…/'
) 周圍使用單引號,用於'\''
在替換文本中放置單引號。如果正則表達式或替換文本來自 shell 變數,請記住
- 正則表達式是 BRE,而不是文字字元串。
- 在正則表達式中,換行符需要表示為(除非您有其他程式碼將換行符添加到模式空間,
\n
否則它永遠不會匹配)。sed
但請注意,它不適用於某些sed
實現的括號表達式。- 在替換文本中,
&
需要\
引用 和換行符。- 分隔符需要被引用(但不是在括號表達式內)。
- 使用雙引號進行插值:
sed -e "s/$BRE/$REPL/"
.