работа со строками html в bash

Список каталогов и файлов, которые пользователь(ubuntuв примерах)имеет разрешения на чтение с по:

find -exec sudo -u ubuntu test -r '{}' \; -print

Список каталогов и файлов, для которых пользователь имеет права на запись в:

find -exec sudo -u ubuntu test -w '{}' \; -print

Список каталогов и файлов, для которых пользователь имеет разрешения на выполнение с по:

find -exec sudo -u ubuntu test -x '{}' \; -print

Список каталогов и файлов, для которых пользователь имеет права на чтение, запись и выполнение с по:

find -exec sudo -u ubuntu test -rwx '{}' \; -print
0
26.04.2021, 15:11
2 ответа

Вы можете использовать xmlstarletдля разбора XML и выбора 2-го, 3-го и 4-го <td/>значений элементов. Если у вас есть другие таблицы и строки таблиц, вам нужно предоставить больше своего HTML-кода или самостоятельно решить, как выбрать соответствующий раздел.

Сегмент кода для синтаксического анализаpage.html

apple_var=$(
    xmlstarlet fo -H page.html |
    xmlstarlet sel -t -v 'concat(//td[2],"+",//td[3],"+",//td[4])' -n 2>/dev/null |
    bc
)
echo apple_var=$apple_var

Выход

apple_var=1562

Первый вызов xmlstarletвыполняет синтаксический анализ HTML и максимально возможное преобразование его в XML. Второй вызов анализирует этот XML и извлекает требуемые значения элементов <td/>вместе с символами +между ними. Заключительная часть конвейера выполняет математические операции, давая желаемое значение результата. При необходимости он назначается apple_var.

3
28.04.2021, 22:51

Ответ зависит от того, насколько гибким может быть ваш ввод.

Если предположить, что

  1. цифры всегда в 3-й строке,
  2. числа всегда целые,
  3. 3-я строка не содержит других цифр, кроме тех, которые нам нужны,

тогда это может быть так же просто, как

apple_num=$(sed -n '3p' file.html |       # output the 3rd line
            grep -Eo '[0-9]+' |           # extract all integers and output then one per line
            awk '{s+=$1} END {print s}')  # output sum of all the numbers

Однако этот подход очень хрупок. Например, он не будет работать на <tr><td>apple</td><td>400</td><td style="color: #010203">432</td><td>730</td></tr>(, потому что 010203в style="color: #010203"также будет распознан как число ), и даже на <tr><td>mars1</td><td>400</td><td>432</td><td>730</td></tr>(, потому что 1в mars1будет распознан как число ). ].

Конечно, вы можете уточнить ограничения, например.

apple_num=$(sed -n '3p' file.html |       # extract 3rd line
            egrep -o '>[0-9]+<' |         # extract only parts like >123< (one per line)
            egrep -o '[0-9]+' |           # extract integers (one per line)
            awk '{s+=$1} END {print s}')  # output sum of all the numbers

но чем точнее вы его уточняете, тем менее читаемым он становится. Так что, как правило, вы должны предпочесть более общий подход, такой как , предложенный roaima , в то время как подход grep/sed/awk можно использовать только во временных быстрых -и -грязных oneliner.

1
28.04.2021, 22:51

Теги

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