Альтернативное регулярное выражение для {}

Альтернативное регулярное выражение для {}

Я пытаюсь заменить всю эту строку, но цифры:

looktype="123"

поэтому отображаются только цифры.

Возможно ли это каким-либо простым способом?

{sub ("look type=\"[0-9]{0,3}", "TEST")}

Я пытаюсь сделать это с помощью awk, но безуспешно. Я думаю, что "sub" и {0, 3} мешают.

решение1

Врасширенные регулярные выражения(ERE), означает повторяющийся между и раз. Awk реализует расширенные регулярные выражения, однако исторические реализации awk не имели этого синтаксиса скобок для интервалов повторения.X{m,n}Xmnстандарт POSIXуказывает, что awk должен поддерживать ERE, но многие существующие реализации не соответствуют этому требованию.

С GNU awk,интервалыподдерживаются только с версии 4.0. В более старых версиях вы можете заставить gawk соответствовать POSIX, установив POSIXLY_CORRECTпеременную окружения на непустое значение:

POSIXLY_CORRECT=1 awk '{sub ("looktype=\"[0-9]{0,3}", "TEST"); print}'

Версия awk по умолчанию в некоторых дистрибутивах — не gawk, а mawk, которая меньше и быстрее. Mawk не поддерживает выражения с фигурными скобками.Для этого есть патч., но поскольку mawk не поддерживается, он не получил широкого распространения.

Если количество повторений невелико, можно прописать:

awk '{sub ("looktype=\"[0-9]?[0-9]?[0-9]?[0-9]?", "TEST"); print}'

решение2

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

например

$ echo 'looktype="123"' | sed -r -e 's/^.*"([^"]+)".*/\1/'
123

Обратите внимание, что это -rотносится только к GNU sed, оно говорит sed использовать расширенные, а не базовые регулярные выражения. В других версиях этого sedнет или они могут использоваться -Eвместо этого. В противном случае запишите это в базовом регулярном выражении POSIX (BRE) как:

sed -e 's/^.*"\([^"][^"]*\)".*/\1/'

решение3

В awk(предполагая, чтоточный(ввод, который вы опубликовали) вы также можете сделать это:

awk -F'=' '{print $2}' | sed 's/"//g'

решение4

Альтернатива в GNU grep(которая, как я предполагаю, у вас есть, учитывая тег Ubuntu):

grep -o '[0-9]\+' your_file

Еще более портативная альтернатива с Perl

perl -nle '/([0-9]+)/ and print $1' your_file

Эти два варианта не совсем одинаковы. Они ведут себя по-разному, если у вас есть несколько экземпляров строки цифр в одной строке. Оператор grepвыведет каждое вхождение цифр на отдельной строке, тогда как perlоператор выведет только самое левое вхождение строки цифр в каждой строке. Это связано с разницей во внутренней реализации движка регулярных выражений между grepи Perl.

Связанный контент