2017-02-16 41 views
2

Предположим, у меня есть следующий файл:Читать весь файл в переменную, сохраняя экранированные символы нетронутыми

hello\nworld 

То есть строка \n в буквальном смысле присутствует в файле:

$ cat input.txt 
hello\nworld 

Я хочу прочитайте этот файл точно так же, как в переменной в оболочке. Тем не менее, все общие подходы для чтения данных из файла, как и те, которые описаны here, делают оболочку интерпретировать \n последовательность как символ новой строки:

% test="$(<input.txt)" 
% echo "$test"   
hello 
world 
% test="$(cat input.txt)" 
% echo "$test" 
hello 
world 

Это было совершенно неожиданно для меня, и, честно говоря, я не совсем понимаю, что Я не могу найти ответ на эту проблему в Интернете; Я ожидал, что кто-то уже справился с этой проблемой.

Я также видел, что если вы используете read -r при чтении файла по строкам, он работает, но я не хочу читать его по строкам, я хочу прочитать весь файл. Конкретно, я хочу, чтобы переменная test содержала строку «hello \ nworld» буквально. Как мне это сделать?

+1

Возможно ли ваше 'эхо' с псевдонимом' echo -e'? – gudok

+0

@gudok нет, нет. –

+0

Что говорят 'type echo' и' which echo'? – Leon

ответ

3

Возможно, вы используете read -r -d '' <input.txt, чтобы прочитать весь файл в одной строке.

Однако в моих тестах я не получаю такого поведения. Возможно, ваша интерпретация echo. Попробуйте printf "%s" "$test", чтобы узнать, исправляет ли он это.

+0

Ничего себе, действительно трюк printf действительно работал, поэтому выглядит как '$ (<файл)' работает правильно. Кажется, что это действительно проблема с эхом. Тем не менее, я теперь вспомнил, что на самом деле я использую zsh вместо bash, возможно, это происходит из-за zsh. –

+0

Да, я нашел в документации zsh, что по умолчанию 'echo' расширяет escape-символы, а опция' -E' должна быть предоставлена, чтобы отключить это. –

 Смежные вопросы

  • Нет связанных вопросов^_^