web-dev-qa-db-ja.com

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

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

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

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

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

sedで変数を使用するにはどうすればよいですか?

257
UAdapter

シェルは変数の展開を担当します。文字列に一重引用符を使用すると、その内容はリテラルとして処理されるため、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=bertおよびfile=text.txtと仮定):

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

file.txtbertが含まれる場合、出力は次のようになります。

Say hurrah to bert: \0/
347
Lekensteyn

二重引用符を使用して、sedで変数を使用できます。

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

変数にスラッシュ/がある場合、以下のように異なるセパレーターを使用します。

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