2017-01-22 10 views
-1

このようなxargs引数の列挙を最適化することはできますか? 目的は、実際のコマンドの真ん中に単一の引数を挿入することです。xargs引数の列挙を最適化する

私は:

echo {1..3} | xargs -I{} sh -c 'for i in {};do echo line $i here;done' 

または

echo {1..3} | for i in $(xargs -n1);do echo line $i here; done 

を私が取得:

line 1 here 
line 2 here 
line 3 here 

私は必要なものですが、ループと一時変数を避けることができれば、私は疑問に思っていますか?

+2

エコー行$ iをここで行います。済んだ? – Cyrus

+0

あなたの質問は本当に明確ではなく、本当にXY問題のように見えます。どのような具体的なユースケースがありますか?あなたが求めているよりもはるかに優れたデザインが可能です。 –

+0

@gniourf_gniourf - 後のコマンドのどこでもパイプを通過する、きちんとした引数の使い方を探しているだけです。 – Trebor

答えて

0

xargsを試してみてください。ほとんどの場合、xargsは過剰です。 あなたが本当に望むものに応じて、あなたは{1..3}のiのような解を選ぶことができます。

# Normally you want to avoid for and use while, but here you want the things splitted. 
for i in $(echo {1 2 3});do 
    echo line $i here; 
done 

# When you want 1 line turned into three, `tr` can help 
echo {1..3} | tr " " "\n" | sed 's/.*/line & here/' 

# printf will repeat itself when there are parameters left 
printf "line %s here\n" $(echo {1..3}) 

# Using the printf feature you can avoid the echo 
printf "line %s here\n" {1..3} 
0

これは多分ですか?

echo {1..3} | tr " " "\n" | xargs -n1 sh -c ' echo "line $0 here"' 

trのでxargsは3行を見て、改行をスペースに置き換えられます。より良い(より効率的な)ソリューションがあれば驚くことはありませんが、これは非常に簡単です。

私は以前の回答を修正して、{}の使用を削除しました。これは、潜在的なコードインジェクションの脆弱性を排除するためのコメントに示唆されています。

+1

もっと慣習的には、 'printf '%s \ n' {1..3}'を使用してください。 –

+0

かなり正しいです。私は自分の答えを更新しませんが、もう一方はすでにより良く完成していますが、私の中では最善ではありませんが、間違っていません。 – Fred

+0

'{}' _within 'sh' code_の使用は非常に悪いことです:あなたはデータと_mixingしています!_(これは主な問題の原因の1つであり、認識して得るべき恐ろしい反パターン除去する)。実際には、 'printf '%s \ n"のような任意のコードを実行するデータを作成するのは非常に簡単です。 rm -rf some_precious_directory# '| xargs -I {} sh -c 'echo line {} here;' '、あなたはいくつかの驚きを得るでしょう! _data_を_data._として扱わなければなりません。 xargs -n1 sh -c 'echo "行$ 1ここで" sh "。 {\ f2} '\; ' –

1
あなたは改行で xargsへの入力を分離する必要があり

ar=({1..3}) 
printf '%s\n' "${ar[@]}" | xargs -I% echo line % here 

(と、それは出力のためだけだ場合、あなたはそれを使用することができます:アレイの拡張のために

echo {1..3}$'\n' | xargs -I% echo line % here 

を、あなたはprintfを使用することができますなしxargs

printf 'line %s here\n' "${ar[@]}" 

+0

私は中括弧拡張処理の接頭辞と接尾辞については知らなかった。知っておいてよかった。他のタイプの展開(配列内のすべての要素を展開するなど)を含む他のシナリオではこれが機能しないことに言及する価値があります。 – Fred

+0

@Fred:updated。 – choroba

+0

'echo {1..3} $ '\ n''は 'echo 1 $ '\ n' 2 $ '\ n' 3 $ '\ n"に展開されるので、 'echo'は3つの引数を見ることに注意してください。今度は 'echo'は空白で区切られた引数を表示しますので、' 2'と '3'は空白の接頭辞が付きます。空の末尾の行も得られます(' echo'は、終わり)。これは、後で、 '-d \\ n 'で(GNU)' xargs'をより堅牢に使用したい場合に問題になります。 'printf'バージョンは明らかに優れており、より慣用的です。 –

0

GNU sedのよく知られていない機能があります。 sコマンドにeフラグを追加すると、sedはパターンスペースにあるものを実行し、そのコマンドがあればパターンスペースを出力に置き換えます。

echo {1..3} | sed -r 's/([^ ])+/echo "line \1 here"\n/ge 
    :あなたは、エコーコマンドの出力では、実際にのみ関心がある場合

    、あなたは一時変数、ループを解消する例SEDこのGNU、(そして同様にxargsのを)試してみてください

  • それは1つのトークンをフェッチする(すなわち\1トークン
  • により置換でどんなスペースで区切られている)
  • は、echo "line \1 here"\nコマンドに置き換え、その後エコー
  • を実行し、それが出力するその
  • バックパターン空間にエコーコマンドの出力を置きます所望の出力を得るための3つのエコー

の結果しかし、たとえ良い方法は、実行をスキップして、SEDに直接変換を行う、のようにすることですこれは

​​
関連する問題