私は 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 つの単語文字 (例:または)、2 つのアスタリスク、それに続く で構成される文字列を検索します。\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