파일 줄을 반복하는 방법?


61

이 파일이 있다고 가정 해보십시오.

hello
world
hello world

이 프로그램

#!/bin/bash

for i in $(cat $1); do
    echo "tester: $i"
done

출력

tester: hello
tester: world
tester: hello
tester: world

for공백을 무시하고 각 줄을 개별적으로 반복 하고 싶습니다 . 즉, 마지막 두 줄은

tester: hello world

따옴표 for i in "$(cat $1)";를 사용 i하면 전체 파일이 한 번에 할당됩니다. 무엇을 바꿔야합니까?

답변:


69

와 함께 forIFS :

#!/bin/bash

IFS=$'\n'       # make newlines the only separator
set -f          # disable globbing
for i in $(cat < "$1"); do
  echo "tester: $i"
done

그러나 빈 줄은 IFS- 공백 문자 인 개행 문자 로 건너 뛰고 그 순서는 1로 계산되며 선행 및 후행 문자는 무시됩니다. 로 zshksh93(하지 bash), 당신은 그것을 바꿀 수 IFS=$'\n\n'있지만, 개행 문자는 특별하게 취급되지 않도록 모든주의 후행 개행 문자 (그래서 빈 줄 후행 포함)은 항상 명령 치환에 의해 제거됩니다.

또는 read (더 이상 cat) : 없습니다

#!/bin/bash

while IFS= read -r line; do
  echo "tester: $line"
done < "$1"

빈 줄은 유지되지만 줄 바꿈 문자로 올바르게 구분되지 않으면 마지막 줄을 건너 뜁니다.


5
고마워, 나는 <전체 루프에 들어갈 수 있다는 것을 몰랐다 . 이 수 있지만 완벽 지금 나는 그것을 보았다 감지
토비 Kienzler을

1
내가 볼 IFS \ read -r line' in second example. Is really IFS =`필요? IMHO 말하기 충분 :while read -r line; do echo "tester: $line"; done < "$1"
Grzegorz Wierzowiecki

4
@GrzegorzWierzowiecki IFS=는 선행 및 후행 공백 제거를 해제합니다. 에서 IFS가 효과가없는 이유를 참조하십시오 . while IFS= read..
Gilles

0

가치있는 것을 위해, 나는 그것을 아주 자주해야하며, 정확한 사용법을 기억할 수 없으므로 while IFS= read...bash 프로파일에서 다음 함수를 정의했습니다.

# iterate the line of a file and call input function
iterlines() {
    (( $# < 2 )) && { echo "Usage: iterlines <File> <Callback>"; return; }
    local File=$1
    local Func=$2
    n=$(cat "$File" | wc -l)
    for (( i=1; i<=n; i++ )); do
        "$Func" "$(sed "${i}q;d" "$File")"
    done
}

이 함수는 먼저 파일의 행 수를 결정한 sed후 한 행씩 추출하여 각 행을 단일 문자열 인수로 지정된 함수에 전달합니다. 나는 이것이 큰 파일로 비효율적이라고 생각하지만, 지금까지는 문제가되지 않았다고 생각합니다 (물론이 환영을 개선하는 방법에 대한 제안).

사용법은 꽤 달콤한 IMO입니다.

>> cat example.txt # note the use of spaces, whitespace, etc.
a/path

This is a sentence.
"wi\th quotes"
$End
>> iterlines example.txt echo # preserves quotes, $ and whitespace
a/path

This is a sentence.
"wi\th quotes"
$End
>> x() { echo "$#"; }; iterlines example.txt x # line always passed as single input string
1
1 
1
1
1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.