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