如何在 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可能在哪裡RSSSNA在你的例子中。

怎麼運作的

  • join("", <>)cat正在根據命令的結果建立單一字串
  • =~用這個正規表示式來解析(運算子):

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

    此正規表示式查找以星號開頭並由 [A-Za-z0-9_] 字元(單字的\*快捷方式)和空格組成的字串,一個可能的(0 或1 次),然後是3 個單字字符(例如:或)兩個星星緊跟在後。\w\s~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

相關內容