Содержимое файла в переменную unix с символами новой строки - PullRequest
89 голосов
/ 07 мая 2010

У меня есть текстовый файл test.txt со следующим содержимым:

text1
text2 

И я хочу присвоить содержимое файла переменной UNIX, но когда я делаю это:

testvar=$(cat test.txt)
echo $testvar

результат:

text1 text2

вместо

text1
text2 

Может кто-нибудь предложить мне решение для этого?

Ответы [ 6 ]

142 голосов
/ 07 мая 2010

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

echo "$testvar"

Это даст желаемый результат. Смотрите следующую стенограмму для демонстрации:

pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2

pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2

Причина , почему символы новой строки заменяются пробелами, не целиком связана с командой echo, скорее это комбинация вещей.

Когда передается командная строка, bash разбивает ее на слова в соответствии с документацией для переменной IFS:

IFS: Внутренний разделитель полей, который используется для разделения слов после раскрытия ... по умолчанию установлено значение <space><tab><newline>.

Указывает, что по умолчанию любой из этих трех символов может использоваться для разделения вашей команды на отдельные слова. После этого разделители слов исчезли, все, что у вас осталось, это список слов.

Объедините это с документацией echo (внутренняя команда bash), и вы поймете, почему выводятся пробелы:

echo [-neE] [arg ...]: Вывести аргументы, разделенные пробелами, с последующим переводом строки.

Когда вы используете echo "$x", она заставляет всю переменную x быть одиночным словом в соответствии с bash, следовательно, она не разделяется. Вы можете увидеть это с помощью:

pax> function count {
...>    echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1

Здесь функция count просто выводит количество аргументов. Варианты 1 2 3 и a b c d показывают его в действии.

Затем мы попробуем это с двумя вариантами переменной x. Один без кавычек показывает, что есть четыре слова: "test", "1", "test" и "2". Добавление кавычек делает его одно одно слово "test 1\ntest 2".

8 голосов
/ 07 мая 2010

Bash -ge 4 имеет встроенный mapfile для чтения строк из стандартного ввода в переменную массива.

help mapfile 

mapfile < file.txt lines
printf "%s" "${lines[@]}"

mapfile -t < file.txt lines    # strip trailing newlines
printf "%s\n" "${lines[@]}" 

Смотри также:

http://bash -hackers.org / вики / doku.php / команды / встроенные / * 1008 файле проекта *

8 голосов
/ 07 мая 2010

Это связано с IFS (Внутренним разделителем полей) переменной, которая содержит символ новой строки.

$ cat xx1
1
2

$ A=`cat xx1`
$ echo $A
1 2

$ echo "|$IFS|"
|       
|

Обходной путь - сбросить IFS, чтобы он не содержал новую строку, временно :

$ IFSBAK=$IFS
$ IFS=" "
$ A=`cat xx1` # Can use $() as well
$ echo $A
1
2
$ IFS=$IFSBAK

Чтобы ВЕРНУТЬ это ужасное изменение для IFS:

IFS=$IFSBAK
2 голосов
/ 06 октября 2017

Ваша переменная установлена ​​правильно testvar=$(cat test.txt). Чтобы отобразить эту переменную, состоящую из символов новой строки, просто добавьте двойные кавычки, например,

echo "$testvar" 

Вот полный пример:

$ printf "test1\ntest2" > test.txt
$ testvar=$(<test.txt)
$ grep testvar <(set)
testvar=$'test1\ntest2'
$ echo "$testvar"
text1
text2
$ printf "%b" "$testvar"
text1
text2
1 голос
/ 30 июля 2015

Просто если кого-то интересует другой вариант:

content=( $(cat test.txt) )

a=0
while [ $a -le ${#content[@]} ]
do
        echo ${content[$a]}
        a=$[a+1]
done
0 голосов
/ 01 декабря 2015

Утилита envdir предоставляет простой способ сделать это. envdir использует файлы для представления переменных среды, при этом имена файлов отображаются в имена env var, а содержимое файлов отображается в значения env var. Если содержимое файла содержит символы новой строки, то env var.

См. https://pypi.python.org/pypi/envdir

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...