sed は文字列を \ 文字に置き換えることはできません。

sed は文字列を \ 文字に置き換えることはできません。

tech\私はこのような多くの行を含むfile.phpのすべての文字列を削除しようとしています"tech\/what-is-vnet"。このコマンドはなぜ何もしませんか?

sed -i "s~tech\~~g" file.php

ベストアンサー1

sedバックスラッシュをエスケープ文字として扱います。したがって、\~コマンド文字列に表示されると、エスケープされた意味を持つと解釈され、区切り文字では~なく一致する文字列の一部として扱われる必要があります。これを防ぐには、次のようにバックスラッシュ自体をエスケープする必要があります。その他バックスラッシュ:

sed -i 's~tech\\~~g' file.php

また、二重引用符の使用から一重引用符の使用に変更されました。それはシェルによるものです(Bourneのようなシェルだと仮定)返品バックスラッシュをエスケープ文字として扱います(とは別に一重引用符で囲まれた場合)したがって、二重引用符\\で囲まれた文字列が見つかった場合は、エスケープされたバックスラッシュで解析します。2番目のバックスラッシュだけを渡してください。sed。二重引用符を使用するには、前にバックスラッシュを1つ追加する必要があります。に渡すバックスラッシュの数sed、合計バックスラッシュの数:

sed -i "s~tech\\\\~~g" file.php

sed...これが、パターンなどのシェルメタ文字を含めることができるコンテンツに一重引用符を使用することが推奨される理由の1つです。grep

ps強制関連xkcd:https://xkcd.com/1638/

ppsは実際には3つのバックスラッシュです。会議二重引用符を使用することは、シェルがエスケープされた文字を処理する方法に奇妙な点があるために機能します。たとえば、~シェルはエスケープする価値がないと思います。しかし、これを考慮すると、この混乱はさらに混乱するだけです。

おすすめ記事