![如何在 Linux 中提取特定字符串?](https://linux22.com/image/1083251/%E5%A6%82%E4%BD%95%E5%9C%A8%20Linux%20%E4%B8%AD%E6%8F%90%E5%8F%96%E7%89%B9%E5%AE%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9F.png)
我是 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 旁边的那些)。谢谢!
答案1
由于您感兴趣的值似乎被拆分在多行上,因此我将依靠纯 perl 正则表达式来匹配正确的模式:
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
是正则表达式修饰符,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"}'
答案2
您可以使用cat
来显示文件并grep
仅获取具有所需值的行。
例如:cat myfile | grep 7530SRTRJTROIT
或者获取可以使用egrep
正则表达式的多个值:
egrep "7530SRTRJTROIT|75304KSRTRSHT|753SLRTJSRT|753048SRYTSERY4654|753048499RYTSR" myfile