如何用更多参数包围 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要运行的命令:不是 0、不是 2、不是 3、不是N...

  • 更一般地说:我不想产生新进程对于每个参数。

  • 假设给出了正确性,则首选更简单的工具...因此优先xargssed,后者优先于awk,等等。

  • 我尝试在这里使用标准的 *nix shell 工具。
    显然我可以写一个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 或 SUFFIXninteresting中包含类似%或 的字符,\则需要对这些字符进行转义。

当然 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

相关内容