英数字パターンを除くすべてをどのように削除しますか?

英数字パターンを除くすべてをどのように削除しますか?

私のファイルにはジャンク文字と特殊文字もたくさん含まれています。特定の英数字パターンを維持し、他のすべてを無視したいです(例:AB123456789)。 2文字の「AB」の後に9つの数字が続くこのキーワードだけを抽出したいと思います。

サンプル入力:

[{"u_affected_cis":"m324nkj43nkj3n4kj34n","number":"hhggjjiiijjjf","akdsfj_skdfj":"","as_group":"1,324kj3k4j3k4jk34","or" stage":"gfhgh","cmdb_ci":"0989iujlkj","u_benefit_organization":"","u_creating_group":"luiy98798yukuh","work_notes_list":"","priority":"4","u_tier4_loca ","re​​view_date":"","u_mf_batch_inst_opdoc_move":"","u_requesting_group":"kjhljlkjhlkuh098709kjh","business_duration":"","number":"AB123456789","re​​quested_by":tgfgtf878789khgo7869876ff9007da158c","u_temp","change_plan":"","asd_def":"2023-02-10 11:58:21","description_plan":"implementation_plan" ","u_alternate_programmer_work_number":"","work_start":"","u_signment_group_updated":"","yy_uhggfjk":"","fds":"change_request","close_by":"abcdef"," start_date": 「2023-02-10」}]

サンプル出力:

AB123456789

答え1

実際の入力が有効なJSONの場合は、jqなどのJSON認識ツールを使用する方が良いでしょう。

jq -r '.[0].number'.

(発行された入力は二重引用符が欠けており、キーの1つに値が付加されていないため、有効なJSONではないため、「if」と言います。質問を準備するときに破損が発生したようです。)

答え2

一部の sed が作業を行う必要があります。

sed -e '/AB[0-9]\{9\}/!d' -e 's/.*\(AB[0-9]\{9\}\).*/\1/'

答え3

ファイルに常に同じ数のフィールドがあり、パターンが同じ場所(列72など)に表示される場合は、単純なawkを使用できます。

awk -F "\"" '{print $72}' input-file.txt

ファイルの先頭に同じパターン(AF123456789)があるため、パターンマッチングが機能しないようです。

この答えが役に立つことを願っています。

答え4

私はあなたがしていることをより小さな規模に複製するために次のファイルを作成しました。

┌─[root@Fedora]─[~/stack_exchange]─[03:38 pm]
└─[$]› ls
1234fnjfck   CA123456789      EA123456789  HA123456789  KA123456789   NA123456789  QA123456789  TA123456789              VA123456789  YA123456789
AA123456789  DA123456789      FA123456789  IA123456789  LA123456789  OA123456789  RA123456789  testing-please-delete-me  WA123456789  ZA123456789
BA123456789  DELETE1234  GA123456789  JA123456789  MA123456789  PA123456789  SA123456789  UA123456789              XA123456789

パターンと一致する正規表現変数は、ifステートメントを使用して、for inループのパターンと一致しない必須ファイルを取得する操作を処理できます。

┌─[root@Fedora]─[~/stack_exchange]─[04:07 pm]
└─[$]› pattern="^[A-Z][A-Z][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$"

[$]› for i in $(ls ~/stack_exchange); do if ! [[ $i =~ $pattern ]]; then echo "$i does not match!"; fi; done
1234fnjfck does not match!
DELETE1234 does not match!
testing-please-delete-me does not match!

削除するには:

[$]› for i in $(ls ~/stack_exchange); do if ! [[ $i =~ $pattern ]]; then rm -f $i; fi; done

結果:

[$]› ls
AA123456789  CA123456789  EA123456789  GA123456789  IA123456789  KA123456789  MA123456789  OA123456789  QA123456789  SA123456789  UA123456789  WA123456789  YA123456789
BA123456789  DA123456789  FA123456789  HA123456789  JA123456789  LA123456789  NA123456789  PA123456789  RA123456789  TA123456789  VA123456789  XA123456789  ZA123456789

関連情報