2012-01-01 1 views
7

В Баш на Mac OSX, у меня есть файл (тестовый случай), который содержит строкив Баш «для, сделать эхо, сделанные» расколы линии в пространствах

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 (/ /, "\ п") {печать} ' или 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 на использование 'while read; делать ...; сделанный

+0

@Fredrik: Возможно, хотя это итерация каждой итерации в отдельной подоболочке ... –

+0

отлично. Спасибо. Я посмотрел на метод «пока», но у меня были другие проблемы с ним, которые казались гораздо более трудными для преодоления, чем эта эхо-проблема. – atheaos

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

Не работает ... –

+0

@OliCharlesworth, кстати, поскольку я тестировал ваш ответ, я случайно оставил $ и набрал именно то, что здесь Аррениэль. Это сработало. Хотя теперь, когда я запускаю его на более задействованных данных, я вижу, что есть другие побочные эффекты. – atheaos

+0

@atheaos: Вы уверены? '' \ n "' в Bash - это не то же самое, что в C. Попробуйте изменить инструкцию 'echo', например. 'echo" LINE: $ i ", чтобы узнать, что происходит. –

3

Либо установка IFS как предложено или использовать while:

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

Следует отметить, что это выполняется на каждой итерации в отдельной подоболочке ... –

+0

Да, действительно. Ред. – fge

+0

Это не эффективность, о которой я думал. Вместо этого я думал о проблеме переменной области (переменные не разделяются между «внутри» и «снаружи» цикла). –