Sed

sed 無法用 字元替換字元串

  • September 11, 2022

我正在嘗試刪除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 認為不值得轉義。但考慮到這一點只會讓這個混亂比現在更加混亂。

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