Я не уверен, насколько структурированный Ваши данные всего лишь, если это - как Вы показываете, как насчет следующего:
grep -B2 'Auto-Installed: [^1]'
Это предполагает, что каждая строка файла конфигурации включает Auto-Installed
строка, которая не могла бы быть корректной.
Вот awk программа, которая я думаю, делает точно, как Вы попросили.
awk 'BEGIN{deleted=3}
!deleted{printf "%s",l[NR%3]}
deleted {--deleted}
{l[NR%3]=/./?$0"\n":$0}
/Auto-Installed: 1/{deleted=3}
END{for(i=NR+deleted;i<NR+3;++i)printf "%s",l[i%3]}'
Чтобы завершить комментарии к ответу,
grep -n
будет искать заданное выражение в заданных файлах или стандартном вводе, сообщая номер строки, в которой были найдены совпадения. \"in$Ps\"
- это выражение, которое ищет grep. Поскольку двойные кавычки заключены в кавычки, они являются частью текста, который будет искать grep. Часть $Ps
мне немного непонятна, поскольку оболочка попытается интерпретировать Ps
как имя переменной.
Если $Ps
не задан, то grep
будет искать текст: "in"
.
Если $Ps
установлен, то оболочка заменит эту часть выражения значением $Ps
; например, если Ps=42
, то выражение grep
будет таким: "in42"
.
Если $Ps
- это значение, содержащее пробелы, то оно будет разбито на слова (поскольку расширение не заключено в кавычки), и это нарушит команду. Результирующая строка также подвергнется группировке по имени файла, если в $Ps
присутствуют символы подстановки (например, *
).
Мое лучшее предположение - это ссылка на использование PowerShell в VBScript.
Как сказал Stéphane, **
- это расширенный синтаксис globbing, который здесь используется дважды, чтобы вытащить все файлы, заканчивающиеся на .asp
и .js
из текущего каталога, а также из подкаталогов (рекурсивно) как те, по которым grep
будет искать. Он используется оболочкой, а не grep
.
Короче говоря, код отобразит имена файлов и соответствующие номера строк для строк, которые соответствуют \"in\"
, где за in
следует любое значение $Ps
.