268

これらのコマンドをスクリプトから実行すると、次のようになります。

#my.sh
PWD=bla
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
xxx
bla

それは結構です。

しかし、私が実行すると:

#my.sh
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
$ sed: -e expression #1, char 8: Unknown option to `s' 

チュートリアルで、シェルから環境変数を置き換えるには停止する必要があることを読み、$varname直接置換されないように部分を「引用符で囲みます」。これは私が行ったことであり、変数が直前に定義されている場合にのみ機能します。

$varシェルで定義されている環境変数としてsed を認識させるにはどうすればよいですか?

4

11 に答える 11

398

あなたの 2 つの例は同じように見えるため、問題の診断が難しくなります。潜在的な問題:

  1. 次のように、二重引用符が必要な場合があります。sed 's/xxx/'"$PWD"'/'

  2. $PWDにはスラッシュが含まれる場合があります。その場合、区切り文字として使用するには、含まれていない文字を見つける必要があります。$PWD

おそらく、両方の問題を一度に解決するには

sed 's@xxx@'"$PWD"'@'
于 2009-02-25T06:21:34.340 に答える
175

Norman Ramsey の回答に加えて、文字列全体を二重引用符で囲むことができることを追加したいと思います (これにより、ステートメントが読みやすくなり、エラーが発生しにくくなる可能性があります)。

したがって、「foo」を検索して $BAR の内容に置き換えたい場合は、sed コマンドを二重引用符で囲むことができます。

sed 's/foo/$BAR/g'
sed "s/foo/$BAR/g"

最初の $BAR は正しく展開されませんが、2 番目の $BAR は正しく展開されます。

于 2009-04-14T17:24:39.400 に答える
77

別の簡単な方法:

$PWD通常はスラッシュが含まれるため、sed ステートメントの代わりに/使用します。|/

sed -e "s|xxx|$PWD|"
于 2014-04-17T13:20:36.823 に答える
67

代わりに「/」以外の他の文字を使用できます。

sed "s#$1#$2#g" -i FILE
于 2012-03-08T10:37:13.460 に答える
15

あなたの質問の編集で、あなたの問題がわかります。/home/yourname 現在のディレクトリが...であるとしましょう。この場合、以下のコマンド:

sed 's/xxx/'$PWD'/'

に展開されます

sed `s/xxx//home/yourname//

これは無効です。これを行うには、$PWD\のそれぞれの前に文字を配置する必要があります。/

于 2009-02-25T06:17:36.583 に答える
5

実際、最も簡単なことは (少なくとも GNU sed では)、sed 置換 ( s) コマンドに別のセパレーターを使用することです。したがって、もちろん コマンドを混乱させる に展開される代わりに、s/pattern/'$mypath'/に展開される を使用します。私は強打 ( ) 文字 (または好きなものを使用) を使用しました。これは、通常の、決してあなただけの選択であるスラッシュを区切り文字として使用することを避けます。s/pattern//my/path/ss!pattern!'$mypath'!s!pattern!/my/path!!

于 2012-01-27T16:25:30.947 に答える
3
VAR=8675309
echo "abcde:jhdfj$jhbsfiy/.hghi$jh:12345:dgve::" |\
sed 's/:[0-9]*:/:'$VAR':/1' 

VARフィールドを置き換えるものが含まれている場所

于 2013-04-10T07:35:20.477 に答える
2

同様の問題がありました。リストがあり、テンプレートに基づいてSQLスクリプトを作成する必要があります(@INPUT@置き換える要素として含まれています):

for i in LIST 
do
    awk "sub(/\@INPUT\@/,\"${i}\");" template.sql >> output
done
于 2013-03-25T12:58:20.583 に答える