我是Bash的新手,因此在以下文件中如何获取特定字符串时遇到了困难:
DS*SC*S45WG*X56558*2
NE*823*2*SC*q345w45*DT*RTD*7530SRT
RJTROIT**20140617
SNA**TP*55
DS*SC*S45WG*X56558*2
NE*17*2*SC*211*DT*DFS*75304KSRTRSHT**20140617
RSS**TP*55
DS*SC*S45WG*X56558*2
NE*18*1*SC*3435*DT*PR*753SLRT
JSRT**20140617~RSS**TP*55
DS*SC*S45WG*X56558*1
NE*19*1*SC*ERS*DT*DFS*753048SRY
TSERY4654**20140617~RSS**TP*60
DS*SC*S45WG*X56558*1
NE*19*1*SC*FRAE*DT*ESS*753048499RYTSR**20140722
RSS**TP*140
DS*SC*S45WG*X56558*1
NE*73*46464
SD**15769
SNA*PUI*000015769
上面已经说明了这个文件,我想要获取以下所有数据/值:
7530SRTRJTROIT
75304KSRTRSHT
753SLRTJSRT
753048SRYTSERY4654
753048499RYTSR
(例如,NE * 823 * 2 * SC * q345w45 * DT * RTD旁边的那些)。谢谢!
由于您感兴趣的值似乎被拆分为多行,因此我将依靠纯perl regexp来匹配正确的模式:
cat file.txt | perl -e 's/\s//g && print "$_\n" for join("", <>) =~ /\*([\w\s]+)[~]{0,1}\w{3}\*\*TP/gm'
注意:我已经假设您要查找的值以此定界符结尾:
XXX**TP
这里XXX
可能是RSS
或SNA
在你的榜样。
怎么运行的
join("", <>)
正在根据cat
命令的结果创建一个字符串我使用=~
以下正则表达式来解析(运算符):
/\*([\w\s]+)[~]{0,1}\w{3}\*\*TP/gm
此正则表达式查找以星号开头\*
且由[A-Za-z0-9_]字符(快捷方式\w
为单词)和空格\s
(可能为~
0或1次),然后为3个单词字符(例如:RSS
或SNA
)组成的字符串星星\*\*
紧随其后TP
。
括号仅用于捕获包围在它们之间的模式。
/gm
是regexp修饰符,g
将返回所有匹配的字符串(不仅是第一个),并m
允许多行搜索。
该for
语句遍历所有结果并调用找到的每个匹配项s/\s//g && print "$_\n"
。
s/\s//g
删除所有空格(包括回车符)并print "$_\n"
输出最终结果($_
是for循环中的当前值)
它给了我期望的值(无需在命令中对其进行硬编码):
7530SRTRJTROIT
75304KSRTRSHT
753SLRTJSRT
753048SRYTSERY4654
753048499RYTSR
更新:(包括日期格式)
请现在使用以下命令:
cat file.txt | perl -e 'for$a(join("", <>)=~/\*([A-Z0-9\s]+?)\*\*\d{8}/g){$a=~s/\s+//g;print"$a\n"}'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句