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**TPあなたの例では、どこにXXXそれが当てはまるでしょうRSSか。SNA

使い方

  • join("", <>)catコマンドの結果から単一の文字列を作成しています
  • =~この正規表現を使用して(演算子を) 解析するために使用します:

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

    この正規表現は、アスタリスクで始まり、[A-Za-z0-9_] 文字 (単語の\*ショートカットは) とスペース、可能な場合は(0 回または 1 回)、その後に 3 つの単語文字 (例:または)、2 つのアスタリスク、それに続く で構成される文字列を検索します。\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

関連情報