Z 쉘

Z 쉘

다음과 같이 표준 입력의 각 줄에 대해 명령을 호출하고 싶지만 xargs해당 줄은 명령줄 인수가 아닌 표준 입력으로 전달되어야 합니다.

cat some-file.txt | <magic> | wc -c
  • 그러면 파일의 각 줄에 있는 문자 수가 인쇄됩니다.

내 옵션은 무엇입니까?

답변1

간단한 루프는 어떻습니까?

while IFS= read -r line ;
do
   printf "%s" "$line" | wc -c
done < some-file.txt

답변2

읽는 동안 루프가 가장 명확합니다. xargs를 사용하여 각 행에 대해 작업을 수행하려는 경우 다음과 같은 괴물이 발생할 수 있습니다.

printf "%s\n" "foo bar" one " 1 2 3" | 
xargs -d '\n' -n 1 -I LINE bash -c 'wc -c <<< "LINE"'
8
4
7

각 라인마다 bash 프로세스를 생성해야 하기 때문에 비용이 많이 듭니다.

답변3

cat file.txt | while IFS= read -r i; do echo -n "$i" | wc -c; done
##  or (better):
while IFS= read -r i; do echo -n "$i" | wc -c; done < file.txt

그러나 이는오직한 번에 한 줄씩 한 줄의 문자 수를 인쇄합니다. 더 읽기 쉬운 것을 원한다면 다음 중 하나를 원할 수 있습니다.

##  Prints the contents of each line underneath the character count:
while IFS= read -r i; do echo -n "$i" | wc -c; echo "$i"; done < file.txt
##  Prints the line number alongside the character count:
n=0; while IFS= read -r i; do n=$((n+1)); echo -n "line number $n : "; echo -n "$i" | wc -c; done < file.txt

이식성을 높이기 위해 all printf '%s' "$i"대신 사용할 수 있습니다 .echo -n

답변4

Z 쉘

옵션을 사용하면 행을 변수에 저장하는 것을 피할 수 있습니다.-e

setopt pipefail
cat some-file.txt |
  
  while read -re | wc -c
  do
  done

-r\s를 있는 그대로 읽으세요.

-e입력을 변수에 할당하는 대신 에코 입력

pipefail이 작업을 수행하면 파일 끝에 나타나는 read -re | wc -c0이 아닌 상태 코드로 종료 됩니다.read -re

안타깝게도 이 옵션은 Bash에서는 사용할 수 없습니다.

관련 정보