私のファイルにはジャンク文字と特殊文字もたくさん含まれています。特定の英数字パターンを維持し、他のすべてを無視したいです(例: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 ","review_date":"","u_mf_batch_inst_opdoc_move":"","u_requesting_group":"kjhljlkjhlkuh098709kjh","business_duration":"","number":"AB123456789","requested_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