Подтвердить что ты не робот

Используйте bash для чтения строки за строкой и сохраняйте пространство

Когда я использую "cat test.file", он будет показывать

1
 2
  3
   4

Когда я использую файл bash,

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

Он покажет

1
2
3
4

Как я могу сделать результат так же, как оригинальный тестовый файл?

4b9b3361

Ответ 1

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

Я понимаю, что вы, возможно, упростили пример из чего-то, что действительно нуждалось в конвейере, но прежде чем кто-то еще это скажет:

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

Ответ 2

На самом деле, если вы не укажете аргумент для вызова "читать", read будет устанавливать переменную по умолчанию с именем $REPLY, которая будет сохранять пробелы. Поэтому вы можете просто сделать это:

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

Ответ 3

Просто для дополнения ответа DigitalRoss. В этом случае вы хотите изменить IFS только для этой команды, вы можете использовать фигурные скобки. Если вы это сделаете, значение IFS будет изменено только внутри блока. Вот так:

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

Выход будет (сохранение пробелов):

  word1 check
  word2 check

Ответ 4

read data будет разделять данные с помощью IFS, который обычно "\ t\n". Это сохранит пробелы для вас:

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

Ответ 5

В качестве альтернативы используйте хороший инструмент для анализа файлов, например awk

awk '{
 # do your stuff
 print 
}' file

Ответ 6

Может быть, IFS является ключевым моментом, как говорили другие. Вам нужно добавить только IFS= между while и read.

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

и не забывайте цитаты из $data, иначе echo урежет пробелы.

Но, как сказал Джошуа Дэвис, вы бы предпочли использовать предопределенную переменную $REPLY.