shスクリプトでsedを使用するときにどの文字をエスケープする必要がありますか?

shスクリプトでsedを使用するときにどの文字をエスケープする必要がありますか?

次のスクリプトを使用してください。

#!/bin/sh
sed 's/(127\.0\.1\.1)\s/\1/' [some file]

sh(ここ)で実行しようとすると、dashエスケープする必要がある角かっこが失敗します。しかし、私はいいえバックスラッシュ自体はエスケープする必要があります(オクテット間または\sまたはから\1)。ここにはどんなルールがありますか?またはを使用する必要があるときは{...}どうすればよいですか[...]?逃げる代わりにすべきことのリストがありますか?

ベストアンサー1

これには、シェルとsedという2つのレベルの説明があります。

シェルでは、一重引用符自体を除いて、一重引用符間のすべての内容が文字通り解釈されます。一重引用符の間に一重引用符を作成して効果的に追加できます'\''(一重引用符、リテラル一重引用符、開いた一重引用符)。

Sedが使用するもの基本正規表現。 BREでは、文字セット()内を除いて文字通り$.*[\^処理するために、文字の前にバックスラッシュを付けて引用する必要があります。[…]文字、数字は(){}+?|引用しないでください。いくつかの実装では、それらのいくつかを引用することができます。シーケンス\(、、、\)および\n一部の実装では、、、\{および\}その他のバックスラッシュ+英数字は特別な意味を持ちます\+。一部の実装では、特定の場所から引用を解除することができます。\?\|$^

/また、角かっこ式の外側の正規表現に表示するには、前にバックスラッシュを追加する必要があります。たとえばs~/dir~/replacement~、;を作成して、代替文字を区切り文字として選択できます。\~/dir~pBREに含めるには、区切り記号の前にバックスラッシュが必要です。 BREで特別な意味を持つ文字を選択して文字通り含めたい場合は、3つのバックスラッシュが必要です。一部の実装では動作が異なるため推奨されません。

つまり、次のようになりますsed 's/…/…/'

  • 一重引用符の間に正規表現を作成します。
  • '\''一重引用符で正規表現を終了するために使用されます。
  • バックスラッシュをこれらの文字の前に追加し、その文字の前にのみ追加します$.*/[\]^(角かっこ式内には追加しません)。 (技術的に前のバックスラッシュを追加してはいけませんが]、角括弧式の外部で合計を別々に処理する実装を見たことはありません]。)\]
  • 角かっこ式内で文字通り処理するには、最初または最後(または、でない)であることを-確認してください。[abc-][-abc][a-bc]
  • 角かっこ式内で^文字通り処理するには、次のようにする必要があります。いいえまず(使用するには[abc^]、使用しない[^abc])。
  • ]角かっこ式に一致する文字のリストに含めるには、その文字を最初の文字(または^否定セットの場合は最初の文字)にします。[]abc]または[^]abc][abc]]または[abc\]]ない)。

代替テキストでは:

  • &区切り記号(通常)\や改行文字などの前にバックスラッシュを付けて引用する必要があります。/
  • \次の数字には特別な意味があります。\次の文字は一部の実装で特別な意味(特殊文字)を持ち、\他の文字が続く内容は実装によって異なり\cます。c
  • 代替テキストに一重引用符を追加するsed 's/…/…/'には、引数()を一重引用符で囲みます。'\''

正規表現または代替テキストがシェル変数から来た場合は、次のことを覚えておいてください。

  • 正規表現はリテラル文字列ではなくBREです。
  • 正規表現では、改行は次のように表現する必要があります(パターンスペースに改行を追加する他のコードがない場合は\n絶対一致しません)。sedただし、一部の実装では角括弧式内では機能しませんsed
  • 代替テキストでは、&および\改行文字を引用する必要があります。
  • 区切り文字は引用符で囲む必要があります(角括弧式には含まれません)。
  • 補間に二重引用符を使用して下さい: sed -e "s/$BRE/$REPL/"

おすすめ記事