使用awk,grep进行正则表达式模式匹配的问题

时间:2013-03-28 14:37:53

标签: regex bash grep gawk

我有一个文件“Input_file”,内容如下

%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

它说没有这种匹配模式。我哪里错了。

3 个答案:

答案 0 :(得分:2)

试试这个:

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

答案 1 :(得分:1)

你不能直接在awk中使用你的“pattern(str)”。因为awk默认在多行模式下不起作用。但是你可以用awk做到这一点:

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

以你的例子,上面的单行输出:

%name=ABC
%value=123
%name=XYZ
%value=789

答案 2 :(得分:0)

你可以在你的$ str变量中使用不同的语法,'*'是无用的,因为你搜索的模式不是文字值,因为gawk我不禁抱歉

试试这个:

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

因此,您可以匹配搜索的两个条件