回答:
sed
任意の区切り文字(制御文字を含む)を使用できるように、代替の正規表現区切り文字を使用します。
sed "s~$var~replace~g" $file
$var
純粋なbashの答え:パラメーター展開を使用して、変数内のスラッシュをバックスラッシュでエスケープします。
var="/Users/Documents/name/file"
sed "s/${var//\//\\/}/replace/g" $file
${parameter/pattern/string}
。したがって、この場合、パラメータはvar
、パターンは/\/
、文字列は\\/
です。パターンがで始まるため、パターンのすべてのインスタンスが置き換えられ/
ます。
/
in sedを区切り文字として使用すると、置換されたときに変数のスラッシュと競合し、結果としてエラーが発生します。これを回避する1つの方法は、その変数内の任意の文字から一意の別の区切り文字を使用することです。
var="/Users/Documents/name/file"
あなたは機会に適したoctorsopeキャラクター(または/
使いやすさではない他のキャラクター)を使用できます
sed "s#$var#replace#g"
または
sed 's#$'$var'#replace#g'
これは、変数にスペースが含まれていない場合に適しています
または
sed 's#$"'$var'"#replace#g'
コマンド全体を二重引用符で囲むのと比較して、変数内の何でも置換することに関心があるので、上記を使用する方が賢明です。
$var
containsの場合、~
明らかに別の区切り文字を選択する必要があります。「終了していない」エラー$var
は、改行が含まれているように聞こえます。値のすべての改行をバックスラッシュでエスケープすることで修正できるかもしれませんが、これは完全に移植性があるとは思いません。これは概して、値のスラッシュの問題とは無関係です。
sed -i "s~blah~$var~g" file
実際のsed
スクリプトのみを引用符で囲みます。
これは古い質問ですが、ここでの答えはどれも、操作s/from/to/
については詳しく説明していません。
sed
ステートメントの一般的な形式は次のとおりです。
*address* *action*
ここで、addressは正規表現の範囲または行番号の範囲(または空の場合、アクションはすべての入力行に適用されます)です。だから例えば
sed '1,4d' file
1行目から4行目までを削除します(アドレスは行番号の範囲1,4
で、アクションはd
削除コマンドです)。そして
sed '/ick/,$s/foo/bar/' file
正規表現の最初の一致とファイルの終わりの間の任意の行で、の最初の出現をfoo
で置き換えます(アドレスは範囲であり、アクションは代替コマンドです)。bar
ick
/ick/,$
s
s/foo/bar/
このコンテキストでick
は、変数からのものである場合、次のことができます
sed "/$variable/,\$s/foo/bar/"
(シェルが変数を補間できるように、単一引用符ではなく二重引用符を使用していることに注意してください。二重引用符内にリテラルドル記号を引用符で囲む必要があります)変数にスラッシュが含まれている場合、構文エラーが発生します。(シェルは変数を展開し、結果の文字列をに渡しsed
ます。そのためsed
、リテラルテキストのみが表示されます-シェルの変数の概念はありません。)
解決策は、別の区切り文字を使用することです(変数の値に出現できない文字を使用できる必要があることは明らかです)が、s%foo%bar%
ケースとは異なり、別の区切り文字を使用する場合は、区切り文字の前にバックスラッシュも必要です。デフォルトよりも区切り文字/
:
sed "\\%$variable%,\$s/foo/bar/" file
(単一引用符内では、単一のバックスラッシュで明らかに十分です); または、値のすべてのスラッシュを個別にエスケープすることができます。この特定の構文はBashのみです。
sed "/${variable//\//\\/}/,\$s/foo/bar/" file
または、別のシェルを使用している場合は、
escaped=$(echo "$variable" | sed 's%/%\\/%g')
sed "s/$escaped/,\$s/foo/bar/" file
明確にするため$variable
に、文字列が含まれている場合1/2
、上記のコマンドは次と同等になります。
sed '\%1/2%,$s/foo/bar/' file
最初のケースでは、そして
sed '/1\/2/,$s/foo/bar/' file
第二に。
マクロを展開するだけでなく、変数がファーストクラスのシチズンであるPerlを使用します。
var=/Users/Documents/name/file perl -pe 's/\Q$ENV{var}/replace/g' $file
-p
入力を行ごとに読み取り、処理後に行を出力します\Q
次の文字列内のすべてのメタ文字を引用符で[
囲みます(ここに表示される値には必要ありませんが、値が含まれている場合、または通常の表現に特別な他の値がある場合は必要です)