Преобразование привязок html в уценку с помощью регулярного выражения sed

С 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/и т.д. ), что не загружает в память весь файл, а главное, не требует написания какого-то тупого конечного автомата.

3
25.04.2020, 14:11
1 ответ

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/)
  • PCRE использует a ?после квантификатора для соответствия кратчайшему повторению, стандартные регулярные выражения не
  • Классы символов с отрицанием используются для решения этой проблемы
2
19.03.2021, 02:25

Теги

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