$ grep -vE '^#+( [ [:alpha:]]+ \{\.[ [:alpha:]]+\})?$' file
# Lorem.tip}
# LIPSUM {.tip
# Title
Расширенное регулярное выражение соответствует строкам «ОК». С помощью -v
мы просим посмотреть строки, которые не совпадают.
Шаблон требует, чтобы строка начиналась с некоторого количества #
символов. Остальная часть строки необязательна, но если она существует, она должна начинаться с пробела, затем содержать несколько букв, возможно, с пробелами в -между ними, а затем последний пробел перед {
. Часть в пределах {
и }
должна начинаться с точки и может содержать некоторое количество букв и пробелов.
Это в основном описано в Почему расширение параметра с помощью пробелов без кавычек работает внутри двойных скобок "[[", но не внутри одинарных скобок "["? . В двух словах, [[ … ]]
— это специальный синтаксис с другими правилами синтаксического анализа, а test
и [
— обычные команды.
В простом формате sh
(, включая ksh
, bash
и т. д. ), test -n $var
применяет разделение и подстановку значения var
из-за отсутствия двойных кавычек. Внутри двойных скобок этого не происходит.
Изюминка zsh
заключается в том, что zsh
в основном не требует двойных кавычек вокруг раскрытия переменных. Однако есть одно различие между $var
и "$var"
в контексте списка, например, в командной строке :, если слово пусто и не содержит кавычек, zsh
удаляет его. Таким образом, когда значение var
пусто, test -n $var
— это команда test
с одним аргументом -n
, а test
с одним непустым аргументом -— «истина». Но test -n "$var"
— это команда test
с двумя аргументами -n
и пустой строкой, которая применяет проверку -n
к пустой строке, что является «ложью».
Внутри [[ … ]]
удаление пустого -слова не происходит, поэтому [[ -n $var ]]
и [[ -n "$var" ]]
эквивалентны.