Sedコマンドで変数を使用するにはどうすればよいですか?

私は次のコードを試して置き換えました QQZZ しかし、それは私が望むことをしません:

var1=QQsed -i 's/$var1/ZZ/g' $file

しかし、このコードは私が望むことをします:

sed -i 's/QQ/ZZ/g' $file

どのように変数を使用するのですか sed?

シェルは変数の展開を担当します。 文字列に一重引用符を使用すると、その内容は文字通り扱われるため、 sed 現在、リテラルのすべての出現を置換しようとします $var1 によって ZZ.

二重引用符の使用

二重引用符を使用して、空白を保持しながらシェルが変数を展開するようにします:

sed -i "s/$var1/ZZ/g" "$file"

置換文字列に引用符文字が必要な場合は、その前にシェルによって解釈される円記号を付ける必要があります。 次の例では、文字列 quote me に置き換えられます "quote me" (キャラクター & によって解釈されます sed):

sed -i "s/quote me/\"&\"/" "$file"

単一引用符の使用

シェルのメタ文字がたくさんある場合は、パターンに一重引用符を使用し、変数に二重引用符を使用することを検討してください:

sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"

私が使用する方法に注意してください s,pattern,replacement, の代わりに s/pattern/replacement/、私はとの干渉を避けるためにそれをしました /\0/.

次に、シェルは上記のコマンドを実行します sed 次の引数を使用して(仮定して pattern=bertfile=text.txt):

-is,bert,Say hurrah to &: \0/,text.txt

もし file.txt 含まれています bert、出力はあります:

Say hurrah to bert: \0/

変数を使用することができます sed 二重引用符の使用:

sed -i "s/$var/r_str/g" file_name

あなたがスラッシュを持っている場合 / 変数では、以下のように異なる区切り文字を使用します:

sed -i "s|$var|r_str|g" file_name

を展開する(しゃれた意図)上の @maniの答え,

  • この解決策は、次のような他のコマンドに与えられた正規表現に対して機能します perl
  • 期待どおりに変数を展開するには、正規表現の周りに二重引用符を使用します(はい、Unixyシステムでも)。
  • | 変数の値にも表示される可能性があるので、他の区切り文字を試してみるのを恐れないでください

[あなたのこの投稿の私の答え]を参照してください(bash - How to escape file path in SED? - Ask Ubuntu

関連:Escape a string for a sed replace pattern - Stack Overflow