我想以相反的顺序获取从模式A匹配行到第一次出现的模式B匹配行以及它通过的行的行。
更新:example_file.txt
ISA*00* *00* *ZZ*SIX-SIX6 *12*666666666666 *66666666*6666*U*666666666*6666666666*0*P*\
GS*FA*SIX-SIX-SIX*666666666*6666666*6666*6666*X*66666
ST*666*666
AK1*SX*666
AK2*777*6666666
AK5*A
AK2*777*7777777
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*R*5
AK2*777*6666666
AK5*A
AK2*777*69696969
AK3*J7*5**3
AK4*3*6969*4
AK5*R*5
AK9*P*20*20*19
SE*69*6969
GE*1*6767
IEA*1*0000000000
我想要的是,从下到上,得到它后面的所有AK5
模式R
,如下所示:
模式一:AK5*R
并让所有的线上升,直到模式B的第一次出现被匹配。例如:
模式乙:AK2
期望的输出:
第一个匹配的模式A将被称为E1
AK2*777*7777777
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*R*5
更新:匹配的第二个模式A将称为E2
AK2*777*69696969
AK3*J7*5**3
AK4*3*6969*4
AK5*R*5
如果有超过 1 个模式A匹配,则依此类推。
编辑:我知道sed
可以做到这一点,但我仍然没有运气从每个模式 A 匹配到它第一次出现的模式 B 匹配并将它们存储在临时文本文件中以供进一步处理。
这是我的示例命令,sed
它获取example_file.txt
sed -ne '/AK2\*/,/\AK5\*R/p' example_file.txt
示例命令逻辑场景:
A="AK5\*R"
B="AK2"
find the first $A < example_file.txt; # AK5\*R
move to previous line until first occurrence of $B line; # AK2*any_number*any_number
get all lines from first $A to its first occurrence of $B and store in a text file; # result > e1.txt
# The same way goes to the second occurrence of pattern A.
(注意:$B 的第一次出现意味着,从每个 $A 行开始获取 $A 行和之前的行,直到它遇到的第一个 $B 匹配行。例如,如果第一个 $A 行从 a 的中间行开始如果文件总共有 100 行,则文件类似于第 50 行,然后从那里移动到上一行,直到命令遇到它看到的第一个 $B 行。)请参见下面的示例。
example_file2.txt
ISA*00* *00* *ZZ*SIX-SIX6 *12*666666666666 *66666666*6666*U*666666666*6666666666*0*P*\
GS*FA*SIX-SIX-SIX*666666666*6666666*6666*6666*X*66666
ST*666*666
AK1*SX*666
AK2*777*6666666
AK5*A
AK2*777*7777777
AK5*A
AK2*777*888888
AK5*A
AK2*777*7777777
AK5*A
AK2*777*5555555
AK5*A
AK2*777*7777777
AK5*A
AK2*777*4545435
AK5*A
AK2*777*7777777
AK5*A
AK2*777*7777777
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*A
AK2*777*0987654
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*R*5
AK2*777*7777777
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*A
AK2*777*7777777
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*A
输出:
AK2*777*0987654
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*R*5
再次阅读您的描述,我知道您希望模式 B 的第一个匹配项从下到上直到(向上)模式 A 的第一个匹配项。但是结果部分应该按照文件的顺序排列。
这需要很多逻辑。下面的shell脚本完成了这一切。将结果以正确的内部顺序放在文件
E
和一些数字中,第一个文件 (E1
) 将具有从顶部开始的第一个匹配项,最后一个文件将具有最后一个匹配部分。结果范围将是:
POSIX
ex
再次来救援!ex
是 POSIX 指定的可编写脚本的文件编辑器。对于涉及向后寻址的任何事情,它通常是比 Awk 或 Sed 好得多的解决方案。以下单行代码非常适用于您的
example_file2.txt
:在您的 上
example_file.txt
,它也可以工作,但是因为g
lobal 命令ex
无法为每个操作范围写入单独的目标,所以所需的两个输出文件合并如下:然而,这很容易处理 — 使用另一个 POSIX 工具,
csplit
该工具旨在根据“上下文”拆分文件。便携式 POSIX 解决方案:
最后一个要素可以使这成为一个完美的解决方案,即以相反的顺序重新编号文件。这部分我没有做过。
如果您不关心文件编号与文件的顺序相同,并且您不介意是否
.txt
省略扩展名,并且您不介意文件编号是从而e01
不是从e1
,并且如果您不介意打印关于每个文件中有多少行的诊断消息,那么我们可以简化: