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


266

私は交換するには、次のコードを試みたQQとしZZ、それは私がやりたいことはありません。

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

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

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

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



回答:


358

シェルは変数を展開します。あなたは文字列の単一引用符を使用するときに、その内容は、文字通り扱われます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.txt含むbert場合、出力は次のようになります。

Say hurrah to bert: \0/

2
このコンマ区切り形式を使用して「/ g」オプションをどのように渡しますか?
14

6
@ b.longこれはgオプションなので、s,foo,bar,g代わりに渡します。
-Lekensteyn

1
一重引用符の例は特に便利です。正規表現パターンを使用したsedを非常にうまくカバーしています!
ブライアントーマス

\\0代わりに使用したい\0場合\0は、を単一引用符で囲んでください。それ以外の場合sed\0、完全一致ではなくリテラルをパターンに置き換えます。
-Lekensteyn

私のためにトリックをしました。
ジム

114

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

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

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

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

7
/変数にスラッシュがある場合=>これは私を救った!私の変数はURLで、が含まれています/。使用するように切り替え|、セパレータとしての私の問題を修正
sonlexqt

「変数にスラッシュがある場合」に
賛成
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.