次の文は印刷する必要があります afc abc
が、代わりに印刷されます abc abc
。何度も試してみましたが、結果は毎回同じです。なぜこれが起こるのかわかりません。誰かが説明して助けることができますか?
echo abc|xargs -i{} echo $(echo {}|sed 's/b/f/g') {}
ベストアンサー1
はい、そうです。xargs
これは、シェルが開始される前にコマンド置換がシェルによって実行されるためです。 replacementで操作する文字列を印刷しますecho
。何も変更せずに結果を見ると、次のようになります。{}
sed
sed
xargs
echo {} {}
代わりに:
echo 'abc' | xargs -I{} bash -c 'echo "$(sed "s/b/f/g" <<<"$1")" "$1"' bash {}
ここでは、インラインスクリプトにコマンド置換を挿入して、シェルがコマンド置換を評価するのを防ぎます。スクリプトは(abc
)からコマンドライン引数を取得しxargs
て機能します"$1"
。
printf
ダッシュやその他の文字をオプションとして解釈できる文字に置き換えるには、次の方法を使用することをお勧めa
しますecho
。
echo 'abc' | xargs -I{} bash -c 'printf "%s %s\n" "$(sed "s/b/f/g" <<<"$1")" "$1"' bash {}
または以下なしsed
:
echo 'abc' | xargs -I{} bash -c 'printf "%s %s\n" "${1//b/f}" "$1"' bash {}
または単独で行うことができますsed
(少なくともこの簡単な例では):
echo 'abc' | sed 'h; s/b/f/g; G; s/\n/ /'