我是 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_] 字元(單字的
\*
快捷方式)和空格組成的字串,一個可能的(0 或1 次),然後是3 個單字字符(例如:或)兩個星星緊跟在後。\w
\s
~
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