Shell 获取两个参数之间的内容,参数在文件中多次出现

Shell 获取两个参数之间的内容,参数在文件中多次出现,shell,awk,sed,grep,sh,Shell,Awk,Sed,Grep,Sh,使用awk或sed,如何获取两个参数之间的内容,参数在文件中多次出现 例如,文件内容 Entering AAA 12 Entering BBB 13 Leaving AAA 14 Leaving AAA 15 Leaving AAA 16 Leaving BBB 目前我正在使用 cat 1.txt |sed -n '/Entering AAA/,/Leaving AAA/ p' 有了这个,我得到了第一次出现“进入AAA”和第一次出现“离开AAA”之间的内容 即 但是,我想要从“进入AAA”的

使用awk或sed,如何获取两个参数之间的内容,参数在文件中多次出现

例如,文件内容

Entering AAA
12
Entering BBB
13
Leaving AAA
14
Leaving AAA
15
Leaving AAA
16
Leaving BBB
目前我正在使用

cat 1.txt |sed -n '/Entering AAA/,/Leaving AAA/ p'
有了这个,我得到了第一次出现“进入AAA”和第一次出现“离开AAA”之间的内容 即

但是,我想要从“进入AAA”的第一次出现到“离开AAA”的最后一次出现的内容

预期输出:

Entering AAA
12
Entering BBB
13
Leaving AAA
14
Leaving AAA
15
Leaving AAA

请提供帮助。

在任何awk中,使用双通道方法:

$ awk 'NR==FNR{if (/Leaving AAA/) end=NR; next} /Entering AAA/{f=1} f; FNR==end{exit}' file file
Entering AAA
12
Entering BBB
13
Leaving AAA
14
Leaving AAA
15
Leaving AAA
或者,对于多字符RS和RT,使用GNU awk一次性完成:

$ awk -v RS='Entering AAA.*Leaving AAA' 'RT{print RT}' file
Entering AAA
12
Entering BBB
13
Leaving AAA
14
Leaving AAA
15
Leaving AAA

Short
tac
+
awk
技巧:

tac file | awk '/Leaving AAA/,/Entering AAA/' | tac
输出:

Entering AAA
12
Entering BBB
13
Leaving AAA
14
Leaving AAA
15
Leaving AAA

下面是一个替代解决方案,它使用
perl
在slurp模式下一次完成这项工作:

perl -0777 -pe 's/(?ms).*?(^Entering AAA.*Leaving AAA\R*).*/$1/' file

Entering AAA
12
Entering BBB
13
Leaving AAA
14
Leaving AAA
15
Leaving AAA
  • *
    是一种贪婪模式,它确保在开始模式和结束模式之间匹配最长的字符串
  • (?ms)
    为此正则表达式启用
    多行
    DOTALL
    模式
您也可以使用反向引用:

perl -0777 -pe 's/(?ms).*?(^Entering (AAA).*Leaving \2\R*).*/$1/' file

这正好扭转了问题,因为它将从输入AAA的最后一次出现开始获取文本,而不是从OP请求的第一次开始获取文本-
我想要从“输入AAA”的第一次出现到“离开AAA”的最后一次出现的内容。
。OPs发布的示例输入不足以显示差异。@EdMorton,请参阅问题下的我的评论是否有多行
输入AAA
perl -0777 -pe 's/(?ms).*?(^Entering (AAA).*Leaving \2\R*).*/$1/' file