텍스트 파일에서 이 작업을 수행하면
grep FINAL *.msg
그것은 돌아온다
FINAL COMPUTATIONS: Elapsed Time: 000:30:55.65; CPU Time: 000:30:26.53
FINAL COMPUTATIONS: Elapsed Time: 000:28:11.77; CPU Time: 000:27:41.36
이제 for 루프를 수행하면
for line in `grep FINAL *.msg`
"$line"
"FINAL COMPUTATIONS: Elapsed Time: 000:30:55.65; CPU Time: 000:30:26.53"
한 줄로 취급하지 마십시오 .
이 문제를 어떻게 해결할 수 있나요?
답변1
DopeGhoti의 말이 절대적으로 옳습니다. 여기에 더 적절할 수 있는 내용이 있습니다. 프로세스 대체를 사용하여 grep 출력에서 한 줄씩 읽습니다(패턴은 현재 디렉터리의 모든 *.msg 파일에 적용됩니다).
i=0;
while read -r line; do
echo $((i++)) "$line";
done < <(grep "FINAL" ./*.msg)
Shellcheck 경고가 없는 코드 조각 :)
답변2
이는 쉘이 입력을 분할하는 방식과 관련이 있습니다. 별도로 명시하지 않는 한 공백은 일반적으로 입력을 분할한다는 점을 기억하십시오.
$ echo "Foo bar baz"
Foo bar baz
$ for word in $(echo "Foo bar baz"); do echo $word; done
Foo
bar
baz