我正在尝试遵循以下解决方案
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
答案 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