2016-11-22 8 views
1

В отличие от grep Я не могу определить размер/диапазон символьного символьного класса в `awk. Любая подсказка в правильном направлении ценится.диапазон символов в awk версии 3.1.7

cat input 
1abc 
12abc 
123abc 
1234abc 
12345abc 

В grep я могу определить размер/длина значного полукокса класса

grep -P '^\d{3,4}' input #or grep -P '^[[:digit:]]{3,4}' input 
123abc 
1234abc 
12345abc 
grep -P '^\d{4,}' input #or grep -P '^[[:digit:]]{4,}' input 
1234abc 
12345abc 

Теперь я хочу сделать это с AWK, но то же самое регулярное выражение не работает.

например, следующая команда не дает никакого выхода.

awk '/^[[:digit:]]{3,4}/' input 
awk '/^([[:digit:]]){3,4}/' input 

Я ожидал, что выше команда печати

123abc 
1234abc 
12345abc 

Примечание 1: В настоящее время я использую, чтобы определить диапазон, но это не сладкий для большого диапазона.

awk '/^[0-9][0-9]?[0-9]?/' input 

Примечание 2:

awk --version |head -1 
GNU Awk 3.1.7 
+0

Не удается воспроизвести. GNU Awk 4.1.4 производит именно ваш желаемый результат. – infotoni91

+2

В RHEL 5 и GNU awk 3.1.5 вы должны использовать опцию '--posix'. – Jdamian

+0

@Jdamian, спасибо, я царапал себе голову из последних нескольких часов. , –

ответ

3

Используйте --posix вариант.

В мужских страницах AWK версии 3, вы можете прочитать:

r{n,m}  One or two numbers inside braces denote an interval expression. If there is one number in the braces, the preceding regu- 
      lar expression r is repeated n times. If there are two numbers separated by a comma, r is repeated n to m times. If 
      there is one number followed by a comma, then r is repeated at least n times. 
      Interval expressions are only available if either --posix or --re-interval is specified on the command line. 
+1

Это справочная страница для AWK версии 3 и ранее. В версии 4 интервальные выражения поддерживаются по умолчанию. –