bash – sed / awk – 在跨越多行的模式之间打印文本
发布时间:2020-12-16 01:16:25 所属栏目:安全 来源:网络整理
导读:我是脚本新手,并且正在尝试学习如何提取两种不同模式之间存在的任何文本.但是,在以下场景中,我仍然无法弄清楚如何在两种模式之间提取文本: 如果我的输入文件读取: Hi I would liketo print textbetween these patterns 我的预期输出如下: I would liketo
我是脚本新手,并且正在尝试学习如何提取两种不同模式之间存在的任何文本.但是,在以下场景中,我仍然无法弄清楚如何在两种模式之间提取文本:
如果我的输入文件读取: Hi I would like to print text between these patterns 我的预期输出如下: I would like to print text between these 即我的第一个搜索模式是“嗨”并跳过此模式,但打印出匹配模式后面的同一行中存在的所有内容.我的第二个搜索模式是“模式”,我想完全避免打印此行或超出任何行那. 我尝试了以下方法: sed -n '/Hi/,/patterns/p' test.txt [输出] Hi I would like to print text between these patterns 接下来,我试过: `awk ' /'"Hi"'/ {flag=1;next} /'"pattern"'/{flag=0} flag { print }'` test.txt [输出] to print text between these 有人可以帮助我确定如何实现这一目标吗?
你有正确的想法,awk中的迷你状态机,但你需要一些轻微的mods,如下面的记录:
pax> echo 'Hi I would like to print text between these patterns ' | awk ' /patterns/ { echo = 0 } /Hi / { gsub("^.*Hi ","",$0); echo = 1 } { if (echo == 1) { print } }' 或者,以压缩形式: awk '/patterns/{e=0}/Hi /{gsub("^.*Hi ",$0);e=1}{if(e==1){print}}' 输出是: I would like to print text between these 按照要求. 这种方式的工作方式如下. echo变量最初为0意味着不会发生回声. 依次检查每一行.如果它包含模式,则禁用回显. 如果它包含Hi后跟一个空格,则打开echo,并使用gsub修改该行以除去Hi之外的所有内容. 然后,无论如何,当回波标志打开时,回显(可能已修改)线. 现在,将出现边缘情况,例如: >包含两次Hi的行;要么 你还没有具体说明它们应该如何处理,所以我没有打扰,但基本概念应该是相同的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |