Program Club

bash를 사용하여 한 줄씩 읽고 공간을 유지하십시오.

proclub 2020. 11. 30. 20:10
반응형

bash를 사용하여 한 줄씩 읽고 공간을 유지하십시오.


"cat test.file"을 사용하면

1
 2
  3
   4

bash 파일을 사용할 때

cat test.file |
while read data
do
    echo "$data"
done

그것은 보여줄 것입니다

1
2
3
4

원본 테스트 파일과 같은 결과를 어떻게 만들 수 있습니까?


IFS=''
cat test.file |
while read data
do
    echo "$data"
done

파이프 라인이 정말로 필요한 것으로부터 예제를 단순화했을 수도 있지만 다른 사람이 말하기 전에 다음과 같은 사실을 알고 있습니다.

IFS=''
while read data; do
    echo "$data"
done < test.file

실제로 "read"호출에 인수를 제공하지 않으면 read는 공백을 유지하는 $ REPLY라는 기본 변수를 설정합니다. 따라서 다음과 같이 할 수 있습니다.

$ cat test.file | while read; do echo "$REPLY"; done

DigitalRoss의 반응을 보완하기 위해. 이 명령에 대해서만 IFS를 변경하려는 경우 중괄호를 사용할 수 있습니다. 그렇게하면 IFS의 값은 블록 내에서만 변경됩니다. 이렇게 :

echo '
  word1
  word2' |  { IFS='' ; while read line ; do echo "$line" check ; done ; }

출력은 다음과 같습니다 (공백 유지).

  word1 check
  word2 check

read data일반적으로 "\ t \ n"인 IFS로 데이터를 분할합니다 . 이렇게하면 공백이 유지됩니다.

var=$(cat test.file)
echo "$var"

또는 다음과 같은 좋은 파일 구문 분석 도구를 사용하십시오. awk

awk '{
 # do your stuff
 print 
}' file

아마도 IFS다른 사람들이 말했듯이 핵심 포인트입니다. IFS=사이 에만 추가해야합니다 .whileread

cat test.file | 
while IFS= read data 
 do echo "$data"
 done

의 qutations를 잊지 마세요 . $data그렇지 않으면 echo공백이 정리됩니다.

그러나 Joshua Davies가 언급했듯이 미리 정의 된 변수를 사용하는 것이 좋습니다 $REPLY.

참고 URL : https://stackoverflow.com/questions/7314044/use-bash-to-read-line-by-line-and-keep-space

반응형