xargsの予期しない出力

xargsの予期しない出力

次の文は印刷する必要があります  afc abcが、代わりに印刷されます  abc abc 。何度も試してみましたが、結果は毎回同じです。なぜこれが起こるのかわかりません。誰かが説明して助けることができますか?

echo abc|xargs -i{} echo $(echo {}|sed 's/b/f/g') {}

ベストアンサー1

はい、そうです。xargsこれは、シェルが開始される前にコマンド置換がシェルによって実行されるためです。 replacementで操作する文字列を印刷しますecho。何も変更せずに結果を見ると、次のようになります。{}sedsedxargs

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/ /'

おすすめ記事