[bash] 명령 출력의 각 줄에 쉘 명령을 적용하는 방법은 무엇입니까?

명령의 출력 (예 :)이 있다고 가정하십시오 ls -1.

a
b
c
d
e
...

echo각각에 명령 (예 :)을 적용하고 싶습니다 . 예 :

echo a
echo b
echo c
echo d
echo e
...

bash에서 가장 쉬운 방법은 무엇입니까?



답변

사용하는 것이 가장 쉽습니다 xargs. 귀하의 경우 :

ls -1 | xargs -L1 echo

-L플래그는 입력이 제대로 읽어 보장합니다. 의 맨 페이지에서 xargs:

-L number
    Call utility for every number non-empty lines read.
    A line ending with a space continues to the next non-empty line. [...]


답변

각 줄에서 기본 접두사 작업을 사용할 수 있습니다.

ls -1 | while read line ; do echo $line ; done

또는보다 복잡한 작업을 위해 출력을 sed로 파이프 할 수 있습니다.

ls -1 | sed 's/^\(.*\)$/echo \1/'


답변

for 루프를 사용할 수 있습니다 .

파일의 경우 *; 하다
   에코 "$ file"
끝난

문제의 명령이 여러 인수를 허용하면 xargs 를 사용 하는 것이 문제의 유틸리티를 여러 번 대신 한 번만 스폰하면되기 때문에 거의 항상 더 효율적입니다.


답변

GNU sed 인 경우 실제로 sed를 사용하여 수행 할 수 있습니다.

... | sed 's/match/command \0/e'

작동 방식 :

  1. 명령 일치로 대체 일치
  2. 대체 실행 명령
  3. 대체 라인을 명령 출력으로 교체하십시오.

답변

for s in `cmd`; do echo $s; done

cmd에 큰 출력이있는 경우 :

cmd | xargs -L1 echo


답변

xargs는 백 슬래시, 따옴표와 함께 실패합니다. 그것은 같은 것이어야합니다

ls -1 |tr \\n \\0 |xargs -0 -iTHIS echo "THIS is a file."

xargs -0 옵션 :

-0, --null
          Input  items are terminated by a null character instead of by whitespace, and the quotes and backslash are
          not special (every character is taken literally).  Disables the end of file string, which is treated  like
          any  other argument.  Useful when input items might contain white space, quote marks, or backslashes.  The
          GNU find -print0 option produces input suitable for this mode.

ls -1개행 문자로 항목을 종료하므로 항목 tr을 널 문자로 변환합니다.

이 접근법은 수동으로 반복하는 것보다 약 50 배 느립니다 for ...( Michael Aaron Safyan 의 답변 참조) (3.55 대 0.066s). 그러나 찾기, 찾기, 파일에서 읽기 등의 다른 입력 명령 ( tr \\n \\0 <file) 또는 이와 유사한 작업을 수행해야합니다 xargs.


답변

더 나은 결과 :

ls -1 | xargs -L1 -d "\n" CMD