Sed
sed 無法用 字元替換字元串
我正在嘗試刪除
tech\
file.php 中的所有字元串,這些字元串有很多這樣的行"tech\/what-is-vnet"
。為什麼這個命令什麼都不做?sed -i "s~tech\~~g" file.php
sed
將反斜杠視為轉義字元,因此當它\~
在命令字元串中看到時,會將其解釋為~
已轉義的意思,應將其視為匹配字元串的一部分而不是分隔符。為了防止這種情況,您需要使用另一個反斜杠來轉義反斜杠本身:sed -i 's~tech\\~~g' file.php
另外,請注意,我從使用雙引號切換到單引號。那是因為外殼(假設此處類似於 Bourne 的外殼)也將反斜杠視為轉義(除非它們在單引號中),因此如果它
\\
在雙引號字元串中看到它會將其解析為轉義的反斜杠,並且只將第二個反斜杠傳遞給sed
. 如果要使用雙引號,則需要在要傳遞給的每個sed
反斜杠之前添加另一個反斜杠,總共有 4 個反斜杠:sed -i "s~tech\\\\~~g" file.php
…這是建議將單引號用於可能包含 shell 元字元的事物
sed
和模式的原因之一。grep
ps強制性相關xkcd:https ://xkcd.com/1638/ 。
pps 實際上,三個反斜杠可以在雙引號中使用,因為 shell 處理轉義字元的方式有一個怪癖,比如
~
shell 認為不值得轉義。但考慮到這一點只會讓這個混亂比現在更加混亂。