내 파일에는 정크 문자와 특수 문자도 많이 포함되어 있습니다. 특정 영숫자 패턴을 유지하고 다른 모든 것을 무시하고 싶습니다(예: AB123456789). 두 글자 "AB" 뒤에 9개의 숫자가 오는 이 키워드만 추출하고 싶습니다.
샘플 입력:
[{"u_affected_cis":"m324nkj43nkj3n4kj34n","number":"hhggjjiiijjjf","akdsfj_skdfj":"","as_group":"1,324kj3k4j3k4jk34","order":"","__status":"성공"," stage":"gfhgh","cmdb_ci":"0989iujlkj","u_benefit_organization":"","u_creating_group":"luiy98798yukuh","work_notes_list":"","priority":"4","u_tier4_location": " ","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","implementation_plan":"","short_description" :"data ","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'.
(게시한 입력은 큰따옴표가 누락되고 키 중 하나에 값이 첨부되지 않아 유효한 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