Заменить что-либо внутри идентификатора HTML-тега

Поискал по всему Stackoverflow и Google, и самый близкий ответ:

sed -i -e 's|<element id="lastupdate">\([0-9]\{0,\}\)</element>|<element id="lastupdate">'"$(date -d @${contents})"'</element>|g' /var/www/html/index.html

работает только тогда, когда содержимое тега пусто. Если он уже изменен, его больше нельзя использовать.

Идея состоит в том, чтобы изменить что-либо внутри этого идентификатора тега, а не только тогда, когда он пуст.

Вот хороший ответ о чтении чего-либо внутри идентификатора тега с помощью awk: /questions/37618348/izvlekat-tekst-iz-tegov-html-s-opredelennyim-identifikatorom-ispolzuya-sed-ili-grep/37618372#37618372. Но он работает только для чтения (с awk), а не для добавления/замены (с использованием sed).

Другая идея состоит в том, чтобы иметь не только способ замены: , но и альтернативный способ добавления чего-либо внутри данного тега.

Можно ли использовать инструмент, работающий с HTML, вместо инструмента, созданного специально для XML? Попробовал:

Вход: xmlstarlet ed --update '//element[@id="daipeg"]' --value 'new' index.html

Выход:

      <?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta charset="utf-8"/>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <title>Status - Floflis</title>
    <link rel="shortcut icon" href="icon.ico" type="image/x-icon"/>
    <link rel="icon" href="icon.ico" type="image/x-icon"/>
  </head>
  <body><h1>Floflis Status</h1><ul><li><p>Is DAI pegged to USD? <b><element id="daipeg">No</element></b></p></li><li><p>DAI now worth <b><element id="daiusd"/> USD</b></p></li></ul><p>Last updated in <element id="lastupdate"/> (updates every 5 minutes).</p><a href="https://floflis.github.io/" target="_blank">Main site</a> | <a href="https://floflis.github.io/blog" target="_blank">Blog</a> | <a href="https://floflis.github.io/docs" target="_blank">Documentation</a> | <a href="./api.html">DEV</a>
</body>
</html>

Желаемый результат: изменение «Нет» внутри <element id="daipeg">No</element>на «новый», непосредственно в файл index.html.

1 ответ

(Отвечая на тег xmlstarlet , я использовал версию 1.6.1.)

Если вы устраните проблему с пространством имен и добавите параметр, вы там (заменив elementценность):

      test "${bettersorrythansafe}" || cp file.xhtml file.xhtml.was
xmlstarlet ed --inplace -N X='http://www.w3.org/1999/xhtml' \
    --update '//X:element[@id="daipeg"]' --value 'new' file.xhtml

Или с короткими параметрами и ярлыком для пространства имен по умолчанию:

      xmlstarlet ed -L -u '//_:element[@id="daipeg"]' -v 'new' file.xhtml

Обратите внимание, что --inplaceопция упоминается в xmlstarlet.txt, но не упоминается в руководстве пользователя . Подробнее о _ярлык пространства имен см. руководство пользователя гл. 5.

Чтобы добавить к значению, например:

      xmlstarlet ed -L -N X='http://www.w3.org/1999/xhtml' \
    --var peg '//X:element[@id="daipeg"]' \
    --var res "$((3 * 7 * 2))" \
    -u '$peg' -x 'concat($peg," and then ",$res)' file.xhtml
Другие вопросы по тегам