2013-06-01 2 views
2

Я хочу инициализировать переменную регулярным выражением, а затем использовать ее для сопоставления с образцом. Результаты не ожидаются. Так, например, у меня есть,Использование переменных для инициализации регулярных выражений в awk

BEGIN { 
    item_code_pattern=/ITM-CD-10/ ; 
    } 

    $0 ~ $item_code_pattern{ print ; } 

Я вижу, что записи, которые не имеют шаблон как ITM-CD-10 также поступают в выходной. Просьба указать, что должно быть правильным булевым выражением перед блоком.

Благодаря

+0

Прочитать http://www.gnu.org/software/gawk/manual/ gawk.html # Computed-Regexps и особенно убедитесь, что вы понимаете, что нужно избегать и сколько раз. –

ответ

2

Вы должны отбросить $ и / символы (и нет никакой необходимости для НАЧАТЬ блок, просто присвоить значение переменной в командной строке):

awk '$0 ~ item_code_pattern' item_code_pattern=ITM-CD-10 

При использовании $ , некоторые версии awk испускают ошибку, в то время как другие будут молча преобразовывать переменную в целое значение 0, так что $item_code_pattern точно такое же, как $0, а код $0 ~ $item_code_pattern - тавтология $0 ~ $0.

Если вы настаиваете на использовании блока возможна запись, синтаксис:

BEGIN { item_code_pattern="ITM-CD-10" } 
$0 ~ item_code_pattern 

Обратите внимание, что { print } это правило по умолчанию, если правило не задано, поэтому он является излишним.

3

Вы хотите использовать обычную строку:

awk ' 
    BEGIN { 
    item_code_pattern = "ITM-CD-10" ; 
    } 

    $0 ~ $item_code_pattern { print ; } 
' 

В /pattern/ конструкт проверяет, соответствует ли $0 заданному шаблону, поэтому исходный код эквивалентен говоря:

item_code_pattern = $0 ~ "ITM-CD-10" 

Поскольку $0 пуст в разделе BEGIN, item_code_pattern установлено на 0.

Смежные вопросы