我正在尝试以某种方式使用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
...更一般地说:我不想产生新进程对于每个参数。
假设给出了正确性,则首选更简单的工具...因此优先
xargs
于sed
,后者优先于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