sedコマンドでシェル変数を使用する方法は? [コピー]

sedコマンドでシェル変数を使用する方法は? [コピー]

$記号を使用して変数値を取得できることを知っています。

x=3
echo $x
3

$記号を使用せずに値を取得するために使用できる他の方法はありますか?

$記号が特殊文字であり、これを実行しようとするとエラーが発生するため、このように尋ねますsedsed: -e expression #1, char 31: unterminated s' command

A=25 #lineNumber
destStr="192.168.1.3 192.168.1.4"
sed ""$A"s/Allow from .*/Allow from $destStr/" -i test2

destStrエスケープ文字を使用すると(値の代わりに)文字列が印刷されます\

sed ""$A"s/Allow from .*/Allow from \$destStr/" -i test2

echo代わりに使用してくださいsed

25s/Allow from .*/Allow from  192.168.1.3
192.168.1.4
/ -i test2

ベストアンサー1

最終編集でわかるように、問題はドル記号とは関係ありませんが、その内容が原因で発生しますdeststr。これは192.168.1.3 192.168.1.42行に過ぎず、1つだけを含み、もう1192.168.1.3行は192.168.1.4改行文字で終わる2行です。つまり、変数置換後の実際のコマンドは次のようになります。

sed "25s/Allow from .*/Allow from  192.168.1.3
192.168.1.4
/" -i test2

コマンドラインがsed1行ずつ解釈されるので、解釈したい最初のコマンドは次のようになります。

25s/Allow from .*/Allow from  192.168.1.3

これは明らかに終了していないs注文なので、sedそのように報告されます。

これで見つかったソリューションはecho次のように動作します。

echo $var

エコに電話をかける二つ引数(スペースが引用されていないため、引数区切り文字として解釈されます)、最初のものは、192.168.1.32番目は192.168.1.4両方ともシェルで解釈されなくなった形式です。

echoスペースで区切られた(オプションではない)引数のみが出力されるため、コマンドラインが表示されます。

sed "25s/Allow from .*/Allow from  192.168.1.3 192.168.1.4/" -i test2

予想通り。

$()ただし、コマンドの置き換えの場合、バックティックはエラーが発生しやすいため、可能な限りバックティックを使用する必要があります。したがって、以下はあなたの要件を満たしています。

sed "$A s/Allow from .*/Allow from $(echo $destStr)/" -i test2

引用を簡単にするために、アドレスとコマンドの間にスペースが許可されているという事実も利用しましたsed。これらの追加の空白が不可能な場合は、次の構文を使用することもできます。

sed "${A}s/Allow from .*/Allow from $(echo $destStr)/" -i test2

destStrこれは、空白以外の文字がシェルまたはsed代替文字列に現れる文字によって解釈されないという事実に依存することに注意してください。

おすすめ記事