Я пытаюсь заменить содержимое некоторых HTML-тегов на HTML-странице, используя sed в сценарии bash. По какой-то причине я не получаю должного результата, так как ничего не заменяет. Это должно быть что-то очень простое / глупое, которое я не замечаю, кто-нибудь хочет мне помочь?

HTML для поиска / замены:

Unlocked <span id="unlockedCount"></span>/<span id="totalCount"></span> achievements for <span id="totalPoints"></span> points.

Используемая команда sed:

cat index.html | sed -i -e "s/\<span id\=\"unlockedCount\"\>([0-9]\{0,\})\<\/span\>/${unlockedCount}/g" index.html 

Дело в том, чтобы проанализировать HTML-страницу и обновить цифры в соответствии с некоторыми внешними данными. При первом запуске содержимое тегов будет пустым, после этого они будут заполнены.


РЕДАКТИРОВАТЬ:

В итоге я использовал комбинацию ответов, в результате которой получился следующий код:

sed -i -e 's|<span id="unlockedCount">\([0-9]\{0,\}\)</span>|<span id="unlockedCount">'"${unlockedCount}"'</span>|g' index.html

Большое спасибо @Sorpigal, @tripleee, @classic за помощь!

10
Revell 25 Авг 2011 в 15:31

3 ответа

Лучший ответ

Попробуй это:

sed -i -e "s/\(<span id=\"unlockedCount\">\)\(<\/span>\)/\1${unlockedCount}\2/g" index.html
6
classic 25 Авг 2011 в 11:48

Вы говорите, что хотите сделать, не то, что вы говорите sed.

Вы хотите вставить номер в тег или заменить его, если он есть. То, что вы пытаетесь сказать sed, - это заменить тег span и его содержимое, если оно есть или число, на значение переменной оболочки.

Вы также используете множество сложных, раздражающих и подверженных ошибкам escape-последовательностей, которые просто не нужны.

Вот что вам нужно:

sed -r -i -e 's|<span id="unlockedCount">([0-9]{0,})</span>|<span id="unlockedCount">'"${unlockedCount}"'</span>|g' index.html

Обратите внимание на различия:

  • Добавлен -r для включения расширенных выражений, без которых ваш шаблон захвата не работал бы.
  • Используется | вместо / в качестве разделителя для замены, так что экранирование / не требуется.
  • Заключите выражение sed в одинарные кавычки, чтобы не было необходимости в экранировании вещей внутри него из оболочки.
  • Включил соответствующий тег диапазона в раздел замены, чтобы он не удалялся.
  • Чтобы расширить переменную unlockedCount, закройте выражение в одинарных кавычках, а затем снова откройте его.
  • Опущено cat |, которое здесь было бесполезно.

Я также использовал двойные кавычки для расширения переменной оболочки, потому что это хорошая практика, но если она не содержит пробелов, в этом нет необходимости.

Строго говоря, мне не было необходимости добавлять -r. Обычный старый sed будет работать, если вы скажете \([0-9]\{0,\}\), но идея здесь заключалась в упрощении.

3
sorpigal 25 Авг 2011 в 11:52
sed -i -e 's%<span id="unlockedCount">([0-9]*)</span\>/'"${unlockedCount}/g" index.html 

Я удалил бесполезное использование Cat, убрал кучу ненужных обратных косых черт, добавил одинарные кавычки вокруг регулярного выражения, чтобы защитить его от расширения оболочки, и исправил оператор повторения. Возможно, вам по-прежнему потребуется использовать обратную косую черту для группирующих скобок; мой sed, по крайней мере, хочет \ (... \).

Обратите внимание на использование одинарных и двойных кавычек рядом друг с другом. Одиночные кавычки защищают от расширения оболочки, поэтому вы не можете использовать их вокруг "$ {unlockedCount}", где вы действительно хотите, чтобы оболочка интерполировала переменную.

1
tripleee 25 Авг 2011 в 11:47