如何在 Linux 中提取特定字符串?

如何在 Linux 中提取特定字符串?

我是 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**TPXXX可能在哪里RSS或者SNA在你的例子中。

怎么运行的

  • join("", <>)cat正在根据命令的结果创建一个字符串
  • 我使用=~这个正则表达式来解析(运算符):

    /\*([\w\s]+)[~]{0,1}\w{3}\*\*TP/gm

    此正则表达式查找以星号开头\*并由 [A-Za-z0-9_] 字符 (快捷方式\w用于单词) 和空格组成的字符串\s,可能出现~(0 次或 1 次),然后是 3 个单词字符 (例如:RSSSNA) 两个星号\*\*后跟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

相关内容