Я взял рефлексию из этого ответа и преобразовал его в форму, совместимую с Gawk (беспристрастно):
Код: Выделить всё
/\/]*)(=\s*("[^"]*"|\047[^\047]*\047|[^[:space:]>]+)|[^>])*(>|$)/
< /code>
Но это не решает проблему, если теги могут содержать произвольные ошибки. Например, < /p>
echo '135' | LC_ALL=en_US.utf8 gawk 'BEGIN {IGNORECASE = 1}
{
s = gensub(/\/]*)(=\s*("[^"]*"|\047[^\047]*\047|[^[:space:]>]+)|[^>])*(>|$)/, "(tag)", "g", $0);
print(s)
}'
< /code>
выводит правильные результаты практически для всех входов, которые могут возникнуть на практике, включая входы с ошибками. Например, ввод из этого ответа: < /p>
echo '
0&e link 3' | LC_ALL=en_US.utf8 gawk 'BEGIN {IGNORECASE = 1}
{
s = gensub(/]*(>|$)|]*)(\s+[^[:space:]\/>]+\s*=\s*("[^"]*"|\047[^\047]*\047|[^[:space:]>]+)|[^>])*(>|$)/, "(tag)", "g", $0);
print(s)
}'
[/code]
prints (Tag) 0 (Tag) 1 & amp (TAG) 2 < -> & E Link 3 (TAG) , который является ожидаемым выходом.
или, например,
Код: Выделить всё
echo '23' | LC_ALL=en_US.utf8 gawk 'BEGIN {IGNORECASE = 1}
{
s = gensub(/]*(>|$)|]*)(\s+[^[:space:]\/>]+\s*=\s*("[^"]*"|\047[^\047]*\047|[^[:space:]>]+)|[^>])*(>|$)/, "(tag)", "g", $0);
print(s)
}'
Код: Выделить всё
echo '135' | LC_ALL=en_US.utf8 gawk 'BEGIN {IGNORECASE = 1}
{
s = gensub(/]*(>|$)|]*)(\s+[^[:space:]\/>]+\s*=\s*("[^"]*"|\047[^\047]*\047|[^[:space:]>]+)|[^>])*(>|$)/, "(tag)", "g", $0);
print(s)
}'
Так что мой вопрос: возможно ли улучшать второй regex, что это будет исправлять, что вывод и вывод, что это будет, что -то, что вывод, так что это будет, так что это может быть вход. Места?>
Подробнее здесь: https://stackoverflow.com/questions/795 ... -of-all-vo
Мобильная версия