
Я пытаюсь заменить всю эту строку, но цифры:
looktype="123"
поэтому отображаются только цифры.
Возможно ли это каким-либо простым способом?
{sub ("look type=\"[0-9]{0,3}", "TEST")}
Я пытаюсь сделать это с помощью awk
, но безуспешно. Я думаю, что "sub" и {0, 3} мешают.
решение1
Врасширенные регулярные выражения(ERE), означает повторяющийся между и раз. Awk реализует расширенные регулярные выражения, однако исторические реализации awk не имели этого синтаксиса скобок для интервалов повторения.X{m,n}
X
m
n
стандарт 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.