より多くのパラメータでxarg入力を囲む方法は何ですか?

より多くのパラメータでxarg入力を囲む方法は何ですか?

xargs出力がラインであるプログラムを使用しようとしています。

<ARG1>
<ARG2>
 ...
<ARGN>

次のコマンドが実行されます。

command
    <GLOBAL_PREFIX_1> \
    <GLOBAL_PREFIX_2> \
    ...               \
    <PREFIX1> <PREFIX2> ... ARG1 <SUFFIX1> <SUFFIX2> ... \
    <PREFIX1> <PREFIX2> ... ARG2 <SUFFIX1> <SUFFIX2> ... \
                            ...                          \
    <PREFIX1> <PREFIX2> ... ARGN <SUFFIX1> <SUFFIX2> ... \
    <GLOBAL_SUFFIX_1> \
    <GLOBAL_SUFFIX_2> \
    ...

ここで、プレフィックスとサフィックスはあらかじめ知られていますが、任意です。

とにかく明示的に言及する必要があると思ういくつかの(おそらく)明らかなメモは次のとおりです。

  • パラメータは次のとおりです。いいえ「いいね」改行文字が不足していますが、スペース、、、、$など(を含めることができます)"

  • 可能であれば、それらを1つの巨大な文字列に変換したり、その逆に変換したりするのを避けたいと思います。

  • はい、私が書いたことを意味します。私本物ただしたい1実行するコマンド:0ではない、2ではない、3ではない、N...

  • より一般的に:私新しいプロセスを作成したくない各パラメータについて。

  • 精度があると仮定すると、より簡単なツールが優先されます。したがって、xargs後者sedawk等より優先します。

  • ここでは標準 *nix シェルツールを使用しようとしています。
    明らかにPythonスクリプトを書くことができますが、それはポイントではありません...

答え1

xargsは忘れて、whileループを使用してください。これはprintfが組み込まれていると仮定します。

#!/bin/sh
printf "%s\n" "command"
printf "    %s\\\n" "<GLOBAL_PREFIX_1>" "<GLOBAL_PREFIX_2>" "..."
while read -r ; do
    printf "    <PREFIX1> <PREFIX2> ... %s <SUFFIX1> <SUFFIX2> ... \\\n" "$REPLY"
done
printf "    %s\\\n" "<GLOBAL_SUFFIX_1>" "<GLOBAL_SUFFIX_2>"
printf "    %s\n" "..."

PREFIXnまたはSUFFIXnにまたは類似の文字がinteresting含まれている場合は、これらの文字をエスケープする必要があります。%\

もちろん、sedは動作することができます。

sed '1i\
GP1\\\
GP2\\\
...\\
s/.*/P1 P2 & S1 S2\\/
$s/.*/&\
GS1\\\
GS2\\\
... '

awk の場合、BEGIN と END 句があります。

答え2

arg プレフィックスと arg サフィックスにスペースがない場合は、GNU Parallel の -X が適しています。

seq 1000 | parallel -X echo global prefix argpre{}argpost global postfix

コア数に均等に分配されます。気に入らない場合:

seq 1000 | parallel -j1 -n10 -X echo global prefix argpre{}argpost global postfix

関連情報