使用awk仅匹配pettern的第一次出现

时间:2019-03-14 02:36:31

标签: regex awk

我正在尝试遵循以下解决方案

Moving matching lines in a text file using sed

情况是pattern2在整个文件中只需应用一次。如何更改以下内容以完成此操作

awk '/pattern1/ {t[1]=$0;next}
     /pattern2/ {t[2]=$0;next}
     /pattern3/ {t[3]=$0;next}
     /target3/ { print t[3] }
     1
     /target1/ { print t[1] }
     /target2/ { print t[2] }' file

这是我应用了pattern2(RELOC_DIR)的文件

asdasd0
-SRC_OUT_DIR = /a/b/c/d/e/f/g/h
RELOC_DIR = /i/j/k/l/m
asdasd3
asdasd4
DEFAULTS {
asdasd6
$(RELOC_DIR)/some other text1
$(RELOC_DIR)/some other text2
$(RELOC_DIR)/some other text3
$(RELOC_DIR)/some other text4

由于匹配,文件的最后4行被删除。

asdasd0
-SRC_OUT_DIR = /a/b/c/d/e/f/g/h
asdasd3
asdasd4
DEFAULTS {
RELOC_DIR = /i/j/k/l/m
asdasd6

1 个答案:

答案 0 :(得分:2)

如果是这种情况,我假设您需要检查pattern2以及其他一些情况,然后尝试。

awk '/pattern1/ {t[1]=$0;next}
     /pattern2/ && /check_other_text_in_current_line/{t[2]=$0;next}
     /pattern3/ {t[3]=$0;next}
     /target3/ { print t[3] }
     1
     /target1/ { print t[1] }
     /target2/ { print t[2] }' file

上面正在检查check_other_text_in_current_line字符串(这是一个示例,您可以根据实际字符串进行更改)与pattern2也在同一行中。如果这不是您要找的东西,请在您的帖子中张贴输入样本和期望的输出。



或者,如果您正在寻找Input_file中pattern2的仅第一个匹配项,并跳过所有其他匹配项,然后尝试。它将只打印出pattern2的第一个匹配项,然后跳过所有其他匹配项。(由于OP不提供样本,因此该代码仅用于要求特定的模式匹配)

awk '/pattern1/ {t[1]=$0;next}
     /pattern2/ && ++count==1{t[2]=$0;next}
     /pattern3/ {t[3]=$0;next}
     /target3/ { print t[3] }
     1
     /target1/ { print t[1] }
     /target2/ { print t[2] }' file

OR

awk '/pattern1/ {t[1]=$0;next}
     /pattern2/ && !found2{t[2]=$0;found2=1;next}
     /pattern3/ {t[3]=$0;next}
     /target3/ { print t[3] }
     1
     /target1/ { print t[1] }
     /target2/ { print t[2] }' file


EDIT: 尽管我的第二个解决方案应该是按照OP的要求,但是没有给出完整的要求图片,因此仅添加代码来打印Pattern2(string RELOC_DIR)的第一次出现。

awk '/RELOC_DIR/ && ++ count==1{print}'  Input_file
RELOC_DIR = /i/j/k/l/m

OR

awk '!found2 && /RELOC_DIR/ { t[2]=$0; found2=1; print}' Input_file