Замена содержимого HTML-тега с помощью sed - PullRequest
8 голосов
/ 25 августа 2011

Я пытаюсь заменить содержимое некоторых тегов 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-страницу и обновить цифры в соответствии с некоторыми внешними данными. При первом запуске содержимое тегов будет пустым, после чего они будут заполнены.


EDIT:

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

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

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

Ответы [ 3 ]

6 голосов
/ 25 августа 2011

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

sed -i -e "s/\(<span id=\"unlockedCount\">\)\(<\/span>\)/\1${unlockedCount}\2/g" index.html
1 голос
/ 25 августа 2011

То, что вы говорите, вы хотите сделать, это не то, что вы говорите 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, чтобы не было необходимости убирать вещи из него из оболочки.
  • Включен соответствующий тег span в раздел замены, чтобы он не удалялся.
  • Чтобы развернуть переменную unlockedCount, закройте выражение в одинарных кавычках, а затем снова откройте его.
  • Опущено cat |, которое здесь было бесполезно.

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

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

1 голос
/ 25 августа 2011
sed -i -e 's%<span id="unlockedCount">([0-9]*)</span\>/'"${unlockedCount}/g" index.html 

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...