set
показывает все переменные оболочки (экспортированные или нет). В Bash set -o posix
переводит оболочку в режим совместимости с POSIX. (Я не знаю, имеют ли другие оболочки аналогичный синтаксис для аналогичной функции, но здесь я предполагаю Bash.)
Разница в этом случае состоит в том, что обычно Bash set
показывает также функции оболочки, но в режиме POSIX set
показывает только переменные и слегка меняет формат вывода:
- Когда встроенная функция set вызывается без параметров, она не отображает имена и определения функций оболочки.
- Когда встроенная функция set вызывается без параметров, она отображает значения переменных без кавычек, если они не содержат метасимволов оболочки, даже если результат содержит непечатаемые символы.
В Bash есть дополнительная declare
встроенная функция, которую можно использовать для отображения всех остальных скрытых или специфичных для Bash флагов переменных: declare -p xx
показывает переменную xx
в формате, который Bash может использовать в качестве входных данных. declare -p
показывает все переменные, а declare -f
можно использовать для отображения функций.
Пример:
sed '/^[A-Z]:\\\([^\\]\+\\\)\{3,\}/,+10d' test.txt
Если вы хотите использовать расширенные регулярные выражения (укажите -r
в sed
), тогда выражение станет немного легче для чтения, так как вам нужно будет только экранировать \
:
sed -r '/^[A-Z]:\\([^\\]+\\){3,}/,+10d' test.txt
Примечательная часть - ([^ \ \] + \\) {3,}
, образец в круглых скобках указывает ему соответствие 1 или более экземпляров любого символа, кроме /
, за которым следует один /
]. {3,} сообщает ему, что образец в круглых скобках должен быть сопоставлен по крайней мере 3 раза, чтобы он совпадал.
Использование awk
(, поскольку вопрос заключался в использовании тега awk ):
$ awk -F '\\' 'NF > 4 { skip = 11 } --skip < 0 { print }' file.in
C:\Users\Maison\Documents
True
False
0
1
User
Group
Everyone
Full Access
S-I-D
При этом каждая строка рассматривается как запись с разделителями \
-. Если количество полей в записи больше четырех, мы пропускаем эту запись и следующие 10 строк ввода, устанавливая skip = 11
. Затем эта переменная уменьшается для каждой строки ввода, и если ее значение отрицательно (, что означает, что мы пропустили строки, которые хотели бы пропустить ), мы печатаем строку.
Скрипт можно сократить до
$ awk -F '\\' 'NF > 4 { skip = 11 } --skip < 0' file.in
Обе версии этого скрипта будут ошибаться(давать неправильный вывод ), если любая другая строка, кроме первой в каждом блоке, содержит четыре \
или более.