2013-03-28 2 views
0

У меня есть файл «input_file» с содержанием, как этотПроблемы в регулярных выражениях шаблона с использованием Gawk, Grep

%name=ABC 
%value=123 
sample text in file 
sample text in file 
%name=XYZ 
%value=789 
sample text in file 

мне нужно извлечь строки этого файла, соответствующий этот шаблон.

str="%name=*\n%value=*" 

Я работал так

gawk -v st=$str '/"$st"/ {print}' $Input_file 

Я получаю ошибку

gawk:   ^backslash not last character on line 

Даже с Grep как в

grep -e "$str" $Input_file 

он говорит, что нет такого сопоставив образец. Где я иду не так.

+0

Во-первых - 'grep' является линия-ориентированной, так многострочный модель никогда не будет соответствовать , Во-вторых - 'gawk' ориентирован на линию по умолчанию, поэтому, если вы хотите совместить многострочный шаблон, вам нужно установить [разделитель записей' RS'] (http://www.gnu.org/software/gawk/ manual/gawk.html # Records) к чему-то соответствующему. В-третьих - для целей отладки, я думаю, вам лучше написать свою команду 'gawk' напрямую (например,' gawk '/% name = * \ n% value = */{print}' ', вместо использования переменных Bash и так как в последнем случае трудно определить, находится ли проблема на конце AWK или на конце Bash. – ruakh

+0

В-четвертых, '= *' означает «ноль или более знаков равенства». Для «знака равенства , плюс ноль или более символов ", напишите' =. * '. – ruakh

ответ

2

Попробуйте это:

grep -A1 "^%name=" $Input_file | grep -B1 "^%value=" | grep -v "^--" 
+2

И на всякий случай'% name = 'и'% value = 'появляется в тексте примера, вы можете быть немного более безопасным с' grep - A1 "^% name =" $ Input_file | grep -B1 "^% value =" | grep -v "^ -" '. Это может быть перебор ... – ToddR

+0

@ToddR Действительно. Я на самом деле хотел закрепить первые два а затем забыл. –

0

Вы можете использовать другой синтаксис в вашей переменной $ ул, то «*» бесполезна в потому, что вы ищете шаблон не буквальное значение, для простака я не могу помощь жаль

попробовать это:

str="\%name=|\%value=" 
egrep $str $input_file 

Таким образом, вы можете соответствовать двум критериям поиска Вам

+0

это будет делать что-то другое: он найдет все «имя =» и «значение =», даже если они ** НЕ ** смежные строки – Kent

+0

Я знаю, но в его примере данных он нужно синтаксический анализ всегда сопряжен, возможно, мой подход слишком упрощен – Diego

1

вы не можете напрямую использовать свой «шаблон (str)» в awk. потому что awk default не работает в многострочном режиме. Однако вы могли бы сделать это с AWK:

awk '/^%name=/{n=$0;next}/^%value=/&&n{print n"\n"$0}{n=""}' file 

с вашим примером, выше Однострочник выходы:

%name=ABC 
%value=123 
%name=XYZ 
%value=789 
Смежные вопросы