Как получить первый результат регулярного выражения из файла с помощью bash, grep или sed?

Вам нужно добавить shebang вверху скрипта #!/bin/bashили #!/bin/shили как там у вас.

#!/bin/bash echo test

-2
13.05.2021, 15:03
3 ответа

Если у вас GNU grep, вы можете использовать параметр -P, чтобы включить Perl-совместимые регулярные выражения, которые дают нам команду регулярных выражений \K, что означает «игнорировать все совпадения до этого момента». В сочетании с -m1для остановки на первом совпадении и -oдля печати только совпадающей части строки вы можете выполнить:

$ grep -m1 -oP '<td class="headerCovTableEntryLo">\K[0-9.]' file
39.2

Или аналогично:

$ grep -m1 -oP '(?<=<td class="headerCovTableEntryLo">)[0-9.]+' file
39.2

Альтернативно, с помощьюawk:

$ awk -F'[> ]' '/<td class="headerCovTableEntryLo">/{print $3; exit}' file
39.2
1
28.07.2021, 11:32

Вы можете анализировать HTML с помощью анализатора XML, такого как xmlstarlet.

xmlstarlet fo -H page.html |
    xmlstarlet sel -t -v '//td[@class="headerCovTableEntryLo"][1]' -n 2>/dev/null |
    tr -dc '[:digit:].\n'

Выход

39.2

Первый вызов xmlstarletанализирует HTML и преобразует его, насколько это возможно, в XML. Второй вызов анализирует этот XML и извлекает значение первого элемента <td/>с атрибутом class, соответствующим headerCovTableEntryLo. Финал trудаляет символы пробела и процента из строки (, на самом деле он удаляет все, кроме цифр, точки и новой строки ).

Если вам нужно более точное совпадение, вам нужно будет указать путь //...или опубликовать больше HTML-кода.

Если вы хотите избежать вызова tr, вы можете вернуть значение элемента до, но исключая первый пробел (, поэтому 39.2 %будет возвращено как39.2):

xmlstarlet fo -H page.html |
    xmlstarlet sel -t -v 'substring-before(//td[@class="headerCovTableEntryLo"][1], " ")' -n 2>/dev/null
3
28.07.2021, 11:32

Для завершения всех инструментов grep, awk и sed:

sed -En '/<td class="headerCovTableEntryLo">([0-9.]+).*/{s//\1/p;q}'

0
28.07.2021, 11:32

Теги

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