명령의 마지막 인수가 고정되도록 xargs를 사용하여 명령을 호출할 수 있습니까?
내 시도:
printf '%s\n' a b c d | xargs -I{} echo {} LAST
드디어 해
echo a LAST
echo b LAST
echo c LAST
echo d LAST
xargs 호출을 원합니다
echo a b c d LAST
#fit as many as you can but always finish wiht LAST
가능한 한 휴대 가능한 방식으로 가능합니까?
답변1
너무 길어요 박사님;-I
다른 멋진 옵션 없이 휴대 가능하게 수행할 수 있는 방법은 다음과 같습니다 .
$ echo a b c d f g | xargs -n 2 sh -c 'echo "$@" LAST' sh
a b LAST
c d LAST
f g LAST
$ seq 1 100000 | xargs sh -c 'echo "$#" LAST' sh
23692 LAST
21841 LAST
21841 LAST
21841 LAST
10785 LAST
이 옵션의 문제점은 -I
설계상 손상되었으며 이를 해결할 방법이 없다는 것입니다.
$ echo a b c d f g | xargs -I {} -n 1 echo {} LAST
a b c d f g LAST
$ echo a b c d f g | xargs -I {} -n 2 echo {} LAST
{} LAST a b
{} LAST c d
{} LAST f g
그러나 표준에 다음과 같이 명시되어 있으므로 이러한 사항이 이미 포함되어 있을 수도 있습니다.
-I replstr ^[XSI] [옵션 시작] 삽입 모드: 유틸리티 실행표준 입력의 각 라인에 대해,전체 줄을 단일 인수로 사용, replstr이 발생할 때마다 인수에 삽입합니다.
-n
그리고 및 옵션 과의 상호 작용을 고려하지 않으므로 -d
원하는 대로 자유롭게 수행할 수 있습니다.
다음은 (이전) FreeBSD의 상황입니다. 예상치 못한 것은 아니지만 표준은 아닙니다.
fzu$ echo a b c d f g | xargs -I {} -n 2 echo {} LAST
a b LAST
c d LAST
f g LAST
fzu$ echo a b c d f g | xargs -I {} -n 1 echo {} LAST
a LAST
b LAST
c LAST
d LAST
f LAST
g LAST
답변2
(혼자서) 는 아닙니다 xargs
. 길이를 예측할 수 없는 항목 목록이 있는 경우 xargs
처음(= 첫 번째 요소)에서 어떤 요소가 마지막 요소인지 어떻게 알 수 있나요? 필수 요소를 다른 요소와 분리하려면 몇 가지 추가 논리가 필요합니다.