В разных местах в Интернете я нашел:
\015
\012
\x0a - hex
\n
\r
все как синонимы для различных новых строк / возвратов каретки ...
Но в этом небольшом сценарии я не могу распознать, когда сталкиваюсь с новой строкой - может кто-нибудь сказать мне, что я должен проверять в строке if?
#!/bin/bash
test="this is a
test"
for a in "$test"; do
if [[ "$a" == '\012' ]] ; then
echo "FOUND NEWLINE"
fi
echo "$a"
done
cat | while read line; do ...; done
, вы знаете, что для каждой итерации был возврат каретки. Если ваши входные данные могут быть файлами\r
без\n
, просто преобразуйте файлtr '\r' '\n'
во время обработки ввода. Если вам просто нужно знать , если есть несколько строк:wc -l
.wc -l
вернет 0; Вы должны добавить это как ответОтветы:
Если вы непосредственно используете строки в
for
цикле, он будет работать для каждого слова (здесь одно слово: весь контент,$test
поскольку он указан в кавычках), а не для каждого символа. Вам нужно использоватьwhile
цикл сread
, чтобы анализировать букву за буквой, или вводить числовой параметр, который будет перебирать строку.Кроме того, при использовании
read
необходимо убедиться, что символы новой строки и пробелы не интерпретируются как разделители, и заставитьread
читать один символ за раз.Вот рабочая версия:
Вы можете заменить
$'\n'
на$'\012'
или$'\x0a'
, так как все они представляют один и тот же код новой строки. Но это не то же самое, что\015
или\r
- это означает возврат каретки (возврат к началу строки). В системах Linux переводы строки представлены с использованием\n
, но в Windows, например, они представлены последовательностью\r\n
вместо. Вот почему, если у вас есть текстовый файл из Windows, вы можете обнаружить новые строки, также выполнив поиск\r
.источник
\n
в ее байтовое представление, так что вам не нужно помещать уродливые, заключенные в кавычки разрывы строк в вашем операторе test.Вы можете легко проверить наличие новых строк в переменной с помощью bash:
Я считаю более удобным использовать:
источник
Я бы предложил использовать,
tr
а затемtest
:tr -cd
Удаляет все , кроме перевода строки / возврат каретки. Если в файле есть новые строки, то будет вывод, из которого-n
тест вернет true.источник
\r
s, потому что подстановка команд удаляет завершающие символы новой строки ("$(printf '\n\n\n\n\n')"
это пустая строка).