sedを使用してサフィックスを追加する:2回目の使用時に変数が無視されるのはなぜですか?

sedを使用してサフィックスを追加する:2回目の使用時に変数が無視されるのはなぜですか?

私は次のことを考えました。

xx=abc ; echo "abcde-123" | sed -e s/$xx/$xx_nnn/g

につながります abcde_nnn123。しかし結果はです。

ドイツ語-123

ご覧のとおり、プレフィックスxx=abcが削除され、_nnn置換パターンは完全に無視されます。なぜこれが起こるのですか?

答え1

ここで最大の問題は、実際には存在しない変数を/$xx_nnn/ 渡していることです。$xx_nnnしたがって、基本的に次のように実行しています。

xx=abc ; echo "abcde-123" | sed -e s/$xx//g
#or what is equivalent:
echo "abcde-123" | sed -e s/abc//g

だからあなたは次のようになります:de-123、あなたはabc何も置き換えません。

最善の解決策は、次を使用することです。${varname}たとえば、次のようになります。

xx=abc ; echo "abcde-123" | sed -e "s/$xx/${xx}_nnn/g"

次の内容はすべて}変数名の一部ではありません。

について:

結果は abcde_nnn123 です。

そのような結果ではないでしょう。sed提供されたコマンドを使用すると、次のようになります。

abc_nnnde-123

したがって、本当に次のようにしたい場合は、abcde_nnn123コードは次のようになります。

xx=abcde ; echo "abcde123" | sed -e "s/$xx/${xx}_nnn/g"

以下を使用して文字列を置き換えることもできます。Bash パラメータ拡張。たとえば、

str='abcde123'
xx='abcde'
echo "${str/$xx/${xx}_nnn}" # means: in 'abcde123' replace 'abcde' 
#with `abcde_nnn`

関連情報