我是脚本新手,并且正在尝试学习如何提取两种不同模式之间存在的任何文本.但是,在以下场景中,我仍然无法弄清楚如何在两种模式之间提取文本:
如果我的输入文件读取:
Hi I would like
to print text
between these
patterns
Run Code Online (Sandbox Code Playgroud)
我的预期输出如下:
I would like
to print text
between these
Run Code Online (Sandbox Code Playgroud)
即我的第一个搜索模式是"嗨"并跳过这个模式,但打印出匹配模式后面的同一行中存在的所有内容.我的第二个搜索模式是"模式",我想完全避免打印此行或超出任何行那.
我尝试了以下方法:
sed -n '/Hi/,/patterns/p' test.txt
Run Code Online (Sandbox Code Playgroud)
[输出]
Hi I would like
to print text
between these
patterns
Run Code Online (Sandbox Code Playgroud)
接下来,我试过:
`awk ' /'"Hi"'/ {flag=1;next} /'"pattern"'/{flag=0} flag { print }'` test.txt
Run Code Online (Sandbox Code Playgroud)
[输出]
to print text
between these
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我确定如何实现这一目标吗?提前致谢
你有正确的想法,一个迷你状态机,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 } }'
Run Code Online (Sandbox Code Playgroud)
或者,以压缩形式:
awk '/patterns/{e=0}/Hi /{gsub("^.*Hi ","",$0);e=1}{if(e==1){print}}'
Run Code Online (Sandbox Code Playgroud)
输出是:
I would like
to print text
between these
Run Code Online (Sandbox Code Playgroud)
按照要求.
其工作方式如下.该echo变量最初0意味着不会发生回声.
依次检查每一行.如果包含patterns,则禁用回显.
如果它包含Hi后跟一个空格,则打开echoing 并 gsub用于修改该行以除去所有内容Hi.
然后,无论如何,当echo标志打开时,线(可能被修改)被回显.
现在,将出现边缘情况,例如:
Hi; 要么patterns.你没有具体说明它们应该如何处理所以我没有打扰,但基本概念应该是相同的.