이 파일이 있다고 가정하십시오.
$ cat /tmp/test.txt
Line 1
Line 2 has leading space
Line 3 followed by blank line
Line 5 (follows a blank line) and has trailing space
Line 6 has no ending CR
많은 Bash 솔루션에서 읽은 파일 출력의 의미를 변경하는 네 가지 요소가 있습니다.
- 빈 줄 4;
- 두 줄의 선행 또는 후행 공백;
- 개별 라인의 의미를 유지합니다 (즉, 각 라인은 레코드입니다).
- 6 번 줄은 CR로 끝나지 않았습니다.
빈 줄을 포함하고 CR없이 끝나는 줄을 포함하여 텍스트 파일을 한 줄씩 표시하려면 while 루프를 사용해야하며 마지막 줄에 대한 대체 테스트가 있어야합니다.
다음은 파일을 변경할 수있는 메소드입니다 ( cat
반환 되는 항목과 비교 ).
1) 마지막 줄과 앞뒤 공백을 잃습니다.
$ while read -r p; do printf "%s\n" "'$p'"; done </tmp/test.txt
'Line 1'
'Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space'
( while IFS= read -r p; do printf "%s\n" "'$p'"; done </tmp/test.txt
대신 대신 선행 및 후행 공백을 유지하지만 CR로 끝나지 않으면 마지막 줄을 잃게됩니다)
2) with 프로세스 대체를 사용 cat
하면 전체 파일을 한 번에 읽고 개별 줄의 의미를 잃습니다.
$ for p in "$(cat /tmp/test.txt)"; do printf "%s\n" "'$p'"; done
'Line 1
Line 2 has leading space
Line 3 followed by blank line
Line 5 (follows a blank line) and has trailing space
Line 6 has no ending CR'
(당신이 제거하면 "
에서 $(cat /tmp/test.txt)
당신을 대신 한 꿀꺽보다 말씀으로 파일 단어를 읽어 보시기 바랍니다. 또한 의도 아닐 것 ...)
파일을 한 줄씩 읽고 모든 간격을 유지하는 가장 강력하고 간단한 방법은 다음과 같습니다.
$ while IFS= read -r line || [[ -n $line ]]; do printf "'%s'\n" "$line"; done </tmp/test.txt
'Line 1'
' Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space '
'Line 6 has no ending CR'
선행 및 거래 공간을 제거하려면 IFS=
부품을 제거하십시오 .
$ while read -r line || [[ -n $line ]]; do printf "'%s'\n" "$line"; done </tmp/test.txt
'Line 1'
'Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space'
'Line 6 has no ending CR'
종단없이 (A 텍스트 파일 \n
, 매우 일반적인 반면, POSIX에서 깨진 것으로 간주됩니다. 당신이 후행 믿을 수있는 경우에 \n
필요하지 않은 || [[ -n $line ]]
에while
루프 .)
BASH FAQ 에서 더보기