2012-01-01 1 views
7

에서 "; 에코 수행을위한 수행"분할 선, 내가 선을 포함하는 파일 (테스트 케이스)가, 맥 OSX에 bash는 공백

x xx xxx 
xxx xx x 

하지만이 명령을 실행할 때

for i in `cat r.txt`; do echo "$i"; done 

결과는 내가 원하는대로

x xx xxx 
xxx xx x 

것이 아니라 오히려

x 
xx 
xxx 
xxx 
xx 
x 

어떻게 에코를 'x xx xxx'로 줄 수 있습니까?

+0

AWK 'GSUB (/ /, "\ n") {인쇄} ' 또는 sed's// \ n/g ' – kenny

답변

16

기본적으로 Bash for 루프는 모든 공백을 분할합니다. 제안 IFS 설정

IFS=$'\n' 
for i in `cat r.txt`; do echo "$i"; done 
unset IFS 
+0

OP를'향해 읽는 동안 OP를 가리 키십시오; ...; 완료

+0

@Fredrik : 아마, 각 반복을 별도의 하위 쉘에서 실행하지만 ... –

+0

완벽합니다. 고맙습니다. 나는 'while'방법을 살펴 봤지만이 에코 문제보다 훨씬 어려워 보인 다른 문제가있었습니다. – atheaos

-1
IFS="\n" 
for i in `cat r.txt`; do echo "$i"; done 
unset IFS 
+1

작동하지 않습니다 ... –

+0

@OliCharlesworth 우연히도, 제가 실수로 $를 빠뜨 렸고 Arenielle이 정확히 여기에 입력 한 답변을 테스트하는 중이었습니다. 그것은 효과가 있었다. 이제 더 많은 관련 데이터를 실행했지만 분명히 다른 부작용이 있음을 알았습니다. – atheaos

+0

@atheaos : 정말입니까? Bash의''\ n ''은 C와 같지 않습니다. 'echo "LINE : $ i"'실제로 무슨 일이 일어나고 있는지 살펴 보자. –

3

중 하나 또는 while 사용 : 당신은 IFS 변수를 설정하여 그것을 무시할 수 있습니다

while read theline; do echo "$theline"; done <thefile 
+0

이것은 각각의 반복을 별도의 서브 쉘에서 실행한다고 지적해야합니다 ... –

+0

예, 정말로 그렇습니다. 편집 됨. – fge

+0

내가 생각하고있는 효율성이 아니야. 대신 변수 범위 (변수가 "내부"와 "외부"루프간에 공유되지 않음) 문제에 대해 생각하고있었습니다. –