Соответствие RegEx + удаление дополнительных строк

set показывает все переменные оболочки (экспортированные или нет). В Bash set -o posix переводит оболочку в режим совместимости с POSIX. (Я не знаю, имеют ли другие оболочки аналогичный синтаксис для аналогичной функции, но здесь я предполагаю Bash.)

Разница в этом случае состоит в том, что обычно Bash set показывает также функции оболочки, но в режиме POSIX set показывает только переменные и слегка меняет формат вывода:

  1. Когда встроенная функция set вызывается без параметров, она не отображает имена и определения функций оболочки.
  2. Когда встроенная функция set вызывается без параметров, она отображает значения переменных без кавычек, если они не содержат метасимволов оболочки, даже если результат содержит непечатаемые символы.

В Bash есть дополнительная declare встроенная функция, которую можно использовать для отображения всех остальных скрытых или специфичных для Bash флагов переменных: declare -p xx показывает переменную xx в формате, который Bash может использовать в качестве входных данных. declare -p показывает все переменные, а declare -f можно использовать для отображения функций.

0
18.01.2017, 22:51
2 ответа

Пример:

sed '/^[A-Z]:\\\([^\\]\+\\\)\{3,\}/,+10d' test.txt

Если вы хотите использовать расширенные регулярные выражения (укажите -r в sed ), тогда выражение станет немного легче для чтения, так как вам нужно будет только экранировать \ :

sed -r '/^[A-Z]:\\([^\\]+\\){3,}/,+10d' test.txt

Примечательная часть - ([^ \ \] + \\) {3,} , образец в круглых скобках указывает ему соответствие 1 или более экземпляров любого символа, кроме / , за которым следует один / ]. {3,} сообщает ему, что образец в круглых скобках должен быть сопоставлен по крайней мере 3 раза, чтобы он совпадал.

2
28.01.2020, 02:25

Использование 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

Обе версии этого скрипта будут ошибаться(давать неправильный вывод ), если любая другая строка, кроме первой в каждом блоке, содержит четыре \или более.

1
28.01.2020, 02:25

Теги

Похожие вопросы