С mawk
и gawk
, которые поддерживают регулярные выражения и многосимвольные -символьныеRS
(разделители записей):
awk -v RS='Gathering data' -F'\n' '/Drive name/ && !/Drive Speed/ && !/Drive Temp/{print$(NF-2)}' file
С awk
, который их не поддерживает, входные данные могут быть отфильтрованы, чтобы заменить их каким-либо одним символом, например формой -фид:
awk '/Gathering data/{$0="\f"} 1' file | awk -v RS='\f' -F'\n' '/Drive name/ && !/Drive Speed/ && !/Drive Temp/{print$(NF-2)}'
Если строки в записи не расположены в фиксированном порядке, целые записи могут быть напечатаны без {print...}
, а затем вывод может быть отфильтрован с помощью grep и т. д.
Этот подход имеет то преимущество, что условие согласования может быть изменено очевидным образом (, например. /Drive Speed: 7200 RPMs/
вместо !/foo/ && !/bar/
и т.д. ), что не загружает в память весь файл, а главное, не требует написания какого-то тупого конечного автомата.
sed
использует базовые и расширенные регулярные выражения (BRE/ERE ). .*?
является частью Perl-совместимого регулярного выражения (PCRE ).
Чтобы использовать PCRE, используйтеperl
:
$ perl -pe 's/<a.*?href="(.*?)".*?>(.*?)<\/a>/[\2](\1)/g' test
on [reddit](https://www.reddit.com/) or [Lifehacker](https://lifehacker.com/)
perl -p
, которое считывает и печатает файл построчно – как sed
делает Вот похожее регулярное выражение, использующее ERE сsed
:
$ sed -E 's/<a[^>]*href="([^"]*)[^>]*>([^<]*)[^>]*>/[\2](\1)/g' test
on [reddit](https://www.reddit.com/) or [Lifehacker](https://lifehacker.com/)
?
после квантификатора для соответствия кратчайшему повторению, стандартные регулярные выражения не