通过仅对第一个图案执行精确匹配来提取两个图案之间的线条

时间:2016-05-21 16:18:36

标签: regex bash awk

我试图从位于两条线之间的大文件线中提取,每条线都用一定的图案标记,比如说pattern1和pattern2。 我的代码:

awk "/pattern1/{flag=1;next}/pattern2/{flag=0}flag" filename

验证一行中是否存在“pattern1”并从该行开始打印,直到找到其中存在字符串“pattern2”的后续行。

我想要做的是将字符串“pattern1”与awk开始打印的行完全匹配,并通过验证行中是否存在“pattern2”来检测awk将停止打印的行(不是确切的)匹配)。所以基本上,我想为第一个模式做精确匹配,并保持上面命令的匹配行为为第二个模式。

4 个答案:

答案 0 :(得分:0)

awk具有如下内置功能:

$ cat data 
abcd
pattern1
xyz
pattern2
abcde
$ awk '/pattern1/,/pattern2/' data
pattern1
xyz
pattern2

sed也有:

$ sed -n '/pattern1/,/pattern2/p' data
pattern1
xyz
pattern2

编辑:为此你必须使用某种锚点,\y中的单词边界gawk或者这样的开始和结束锚点:

$ cat data 
abcd
pattern1 234
pattern1
xyz
pattern2
abcde
$ awk '/^pattern1$/,/pattern2/' data 
pattern1
xyz
pattern2

如果您想要打印组合或不打印pattern1 / pattern2行,您可以使用这些:

$ awk '/^pattern1$/{flag=1} /pattern2/{flag=0}flag' data 
pattern1
xyz
$ awk '/^pattern1$/{flag=1;next} /pattern2/{flag=0}flag' data 
xyz
$ awk '/^pattern1$/{flag=1;next;} /pattern2/{flag=0;print}flag' data 
xyz
pattern2

答案 1 :(得分:0)

这里的另一个答案符合问题中的建议:

awk 'BEGIN{flag=0} /^pattern1$/{flag=1;print;next} /pattern2/{flag=0;next} {if (flag == 1) {print}}'

第一个模式必须与整行精确匹配(使用^和$),而第二个模式可以出现在行内的任何位置。

编辑:此版本 打印出出pattern1的行。如果您不想打印它们,请替换" flag = 1; print; next" by" flag = 1; next"。

答案 2 :(得分:0)

awk 'BEGIN{flag=0} /^pattern1$/{flag=1;print;next} /pattern2/{if (flag == 1) {print}; flag=0;} {if (flag == 1) {print}}' filename

这样就可以避免打印双“pattern2”:

me:~$ awk 'BEGIN{flag=0} /^pattern1$/{flag=1;print;next} /pattern2/{if (flag == 1) {print}; flag=0;} {if (flag == 1) {print}}' a
pattern1
xyz
as pattern2 sd

me:~$ cat a
abcd
pattern1 23
pattern1
xyz
as pattern2 sd
abcde
pattern2

答案 3 :(得分:0)

没有样本输入/输出它是一个猜测,但这可能是你想要的:

awk '/pattern2/{flag=0} flag; $0=="pattern1"{flag=1}' filename

可以更有意义地写成:

awk '/end_regexp/{found=0} found; $0=="start_string"{found=1}' filename

(Nbd但命名标记flag与命名函数function一样有用!)

我实际上认为这可能是你真正应该使用的但是idk:

awk 'index($0,"end_string"){found=0} found; $0=="start_string"{found=1}' filename

有关使用awk查找文本的更多方法,另请参阅https://stackoverflow.com/a/18409469/1745001