У меня есть файл, в котором много мусора и специальных символов. Я хочу сохранить определенный буквенно-цифровой шаблон и игнорировать все остальное - например, AB123456789 - я хочу извлечь только это ключевое слово, т.е. два алфавита 'AB' и 9 цифр.
SAMPLE INPUT:
[{"u_affected_cis":"m324nkj43nkj3n4kj34n","number":"hhggjjiiijjjf","akdsfj_skdfj":"","as_group":"1,324kj3k4j3k4jk34","order": "","__status": "success", "phase": "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_assignment_group_updated":"", "yy_uhggfjk": "", "fds": "change_request", "closed_by": "abcdef", "start_date": "2023-02-10"}]
SAMPLE OUTPUT:
AB123456789
Я создал эти файлы, чтобы воспроизвести в меньшем масштабе то, что вы делаете:
┌─[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
соответствие переменной регулярного выражения шаблон сможет обрабатывать извлечение желаемых файлов, которые не соответствуют шаблону в цикле for in, с помощью оператора if:
┌─[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
Если ваш фактический ввод - действительный JSON, вам лучше подойдет инструмент, поддерживающий JSON, например jq:
jq -r '.[0].number'.
(я говорю "если", потому что вводимые вами размещенный недействителен JSON, так как в нем отсутствует двойная кавычка, а один из ключей не имеет значения, связанного с ; я предполагаю, что поломка могла произойти, когда вы готовили {{1} } вопрос.)
Какой-то sed должен выполнять эту работу:
sed -e '/AB[0-9]\{9\}/!d' -e 's/.*\(AB[0-9]\{9\}\).*/\1/'
Если ваш файл всегда имеет одинаковое количество полей и ваш шаблон появляется в том же месте (например, столбец 72), вы можете использовать простой awk :
awk -F "\"" '{print $72}' input-file.txt
Похоже, что сопоставление с образцом вам не подходит, потому что у вас есть тот же образец (AF123456789) в начале файла.
Надеюсь, этот ответ вам поможет.