Как сохранить результат grep с помощью новой строки?

Я хочу присвоить результат grep переменной для дальнейшего использования:

lines=`cat abc.txt | grep "hello"`

но то, что я нашел, - $lines, больше не содержит символа новой строки. Поэтому, когда я делаю

echo $lines

печатается только одна строка. Как я могу сохранить символ новой строки, поэтому, когда я повторяю $lines, это точно так же, как cat abc.txt | grep "hello".

Ответ 1

Вы хотите сказать

echo "$lines"

вместо

echo $lines

Разработать:

echo $lines означает "Создать новую команду, заменив $lines на содержимое переменной с именем lines, разделив ее на пробел, чтобы сформировать нулевые или более новые аргументы в команде echo. Например:

lines='1 2 3'
echo $lines   # equivalent to "echo 1 2 3"
lines='1   2   3'
echo $lines   # also equivalent to "echo 1 2 3"
lines="1
2
3"
echo $lines   # also equivalent to "echo 1 2 3"

Все эти примеры эквивалентны, поскольку оболочка игнорирует определенный вид пробелов между отдельными словами, хранящимися в переменной lines. На самом деле, если быть более точным, оболочка разбивает содержимое переменной на символы специальной переменной IFS (Internal Field Separator), которая по умолчанию (по крайней мере, в моей версии bash) относится к пространству трех символов, вкладке и новой строке.

echo "$lines", с другой стороны, означает создание одного нового аргумента из точного значения переменной lines.

Подробнее см. разделы "Расширение" и "Разделение слов" на странице руководства bash.

Ответ 2

Использование порта Windows для grep (а не исходного вопроса, я не знаю и не применим к * nix). Я обнаружил, что -U хорошо справляется с проблемой.

Из --help:

-U, --binary не снимают символы CR в EOL (MSDOS)