더 많은 매개변수로 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...

  • 보다 일반적으로: 나는새로운 프로세스를 생성하고 싶지 않음각 매개변수에 대해.

  • 정확성이 있다고 가정하면 더 간단한 도구가 선호됩니다. 따라서 , 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

관련 정보