Скажем, у меня есть две переменные в bash:
MULTILINE="I have
more than one line"
SINGLE_LINE="I only have one line
"
Я хочу определить, когда переменная на самом деле содержит более одной строки текста, не обращая внимания на дополнительные завершающие символы новой строки.
Итак, это:
if [ some test on "$MULTILINE" ]; then echo 'yes'; else echo 'no'; fi
будет печатать yes
, и это:
if [ some test on "$SINGLE_LINE" ]; then echo 'yes'; else echo 'no'; fi
будет печатать no
.
В моем конкретном случае я не думаю, что мне нужно беспокоиться о пустых строках, но не помешало бы узнать, как это сделать.
Как я могу это сделать?
Ответы:
Самое простое из известных мне решений:
например:
==>
Выше игнорируются все пустые строки: начальные, конечные и внутренние. Но обратите внимание, что внутренняя пустая строка невозможна, если нет хотя бы двух непустых строк, поэтому ее существование не может изменить вопрос о том, существует ли более одной строки после обрезания начальных и конечных пустых строк.
источник
См. Https://stackoverflow.com/questions/16414410/delete-empty-lines-using-sed
для получения дополнительной информации о том, как обрезать / удалять пробелы и пустые строки, используя sed.
Теперь напишите ваше
if expression ...
использование$( ... )
внутри кавычек, чтобы получить количество строк, и сравните с числом:источник
Небольшое изменение этого кода должно сделать это. Вы можете поместить его в свой собственный скрипт для повторного использования следующим образом:
Затем вы можете использовать его так (при условии, что вы назвали предыдущий скрипт
multiline-check.sh
):источник
fi
. К сожалению, я застрял на Bash 3.1 (версия msysgit). Я не вижу ничего похожего на синтаксическую ошибку, но, очевидно, что-то упускаю. Мысли?Игнорирование висячих пустых строк
Вот подход, использующий
awk
:Как это работает:
echo "$ TEST"
Это берет любую переменную оболочки, которая нас интересует, и отправляет ее в стандарт.
tac
Это меняет порядок строк так, что последняя строка возвращается первой. После выполнения
tac
завершающие строки становятся ведущими.(Название
tac
является обратнымcat
по той причине, чтоtac
делает то, чтоcat
делает, но в обратном порядке.)awk 'f==0 && /./ {f=NR} END{if(f==NR){exit 0}; exit 1 }'
Это сохраняет номер строки первой непустой строки в переменной
f
. После прочтения во всех строках он сравниваетсяf
с общим количеством строкNR
. еслиf
равноNR
, то у нас была только одна строка (игнорируя начальные пробелы), и мы завершаем работу с кодом 0. Если после первой пустой строки была одна или несколько строк, то она завершается с кодом `.&& echo "Found A Single Line"
Если
awk
выйти с кодом 0, тоecho
оператор выполняется.Игнорирование как начальных, так и конечных пустых строк
Создав одну дополнительную
awk
переменную, мы можем расширить тест, чтобы игнорировать как начальные, так и конечные пустые строки:Поскольку эта версия
awk
кода обрабатывает как начальные, так и конечные пробелы,tac
больше не нужна.Взяв
awk
код по частям:first==0 && /./ {first=NR}
Если переменная
first
равна нулю (или она еще не установлена), и в строке есть символ, любой символ, тогда устанавливаетсяfirst
номер строки. Когдаawk
закончится чтение строк,first
будет установлен номер строки первой непустой строки././ {last=NR}
Если в строке есть какой-либо символ, установите для переменной
last
номер текущей строки. Когдаawk
чтение всех строк завершено, эта переменная будет иметь номер последней непустой строки.END{if(first==last){exit 0}; exit 1 }
Это выполняется после того, как все строки были прочитаны. Если
first
равноlast
, то мы увидели ноль или строку непустых строк иawk
выходов с кодом0
. В противном случае он завершается с кодом1
. Сценарий оболочки может тестировать код выхода как обычно с помощьюif
операторов или&&
или||
.источник