соответствие регулярному выражению awk только на одной вкладке

У меня есть простой входной файл для awk, называемый tabmatch.input и со следующим содержимым:

        : (test1
            : (test2

В первой строке есть одна вкладка, затем ":", а во второй строке две вкладки, затем ":". Слова «test1» и «test2» могут быть любым словом в реальном файле, который я пытаюсь разобрать.

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

user@lab-client:~$ cat tabmatch.input |awk '/\t: \(test/ {  {print $2} }'
(test1
(test2

Даже если указать только один \t, а затем ":", он все равно совпадает с двумя \t и ":". Если вместо этого я сопоставляю два \t, он соответствует только второй строке, в которой есть два \t.

user@lab-client:~$ cat tabmatch.input |awk '/\t\t: \(test/ {  {print $2} }'
(test2

Я осмотрелся, но не нашел, почему \t соответствует нескольким \t или как сделать так, чтобы он соответствовал только одному.

Другие попытки, которые я сделал:

user@lab-client:~$ cat tabmatch.input |awk '/[\t]: \(test/ {  {print $2} }'
(test1
(test2

user@lab-client:~$ cat tabmatch.input |awk '/[\t]?: \(test/ {  {print $2} }'
(test1
(test2

awk
person Johnathan    schedule 11.10.2016    source источник


Ответы (1)


Обе ваши строки соответствуют шаблону.

Если вы хотите сопоставить только одну вкладку с начала строки, вам нужно добавить привязку ^:

awk '/^\t: \(test/ { print $2 }' tabmatch.input

Я удалил внутренние фигурные скобки, так как они не делали ничего полезного.

Имейте в виду, что awk может читать файлы сам по себе, поэтому вам не нужно передавать ему данные с помощью cat.

person Tom Fenech    schedule 11.10.2016
comment
Ха-ха, когда ты это сказал, это внезапно обрело смысл. Я не знаю, как я не подумал об этом. Спасибо! Отметит ваш ответ как одобренный через 10 минут, когда это будет возможно. - person Johnathan; 11.10.2016