Вам нужно добавить shebang вверху скрипта #!/bin/bash
или #!/bin/sh
или как там у вас.
#!/bin/bash
echo test
Если у вас 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
Вы можете анализировать 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
Для завершения всех инструментов grep, awk и sed:
sed -En '/<td class="headerCovTableEntryLo">([0-9.]+).*/{s//\1/p;q}'