Используйте bash для чтения строки за строкой и сохраняйте пространство
Когда я использую "cat test.file", он будет показывать
1
2
3
4
Когда я использую файл bash,
cat test.file |
while read data
do
echo "$data"
done
Он покажет
1
2
3
4
Как я могу сделать результат так же, как оригинальный тестовый файл?
Ответы
Ответ 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
.