Как удалить все, кроме буквенно-цифрового шаблона?

У меня есть файл, в котором много мусора и специальных символов. Я хочу сохранить определенный буквенно-цифровой шаблон и игнорировать все остальное - например, 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

0
10.02.2017, 20:18
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

соответствие переменной регулярного выражения шаблон сможет обрабатывать извлечение желаемых файлов, которые не соответствуют шаблону в цикле 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
-1
28.01.2020, 02:46

Если ваш фактический ввод - действительный JSON, вам лучше подойдет инструмент, поддерживающий JSON, например jq:

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

(я говорю "если", потому что вводимые вами размещенный недействителен JSON, так как в нем отсутствует двойная кавычка, а один из ключей не имеет значения, связанного с ; я предполагаю, что поломка могла произойти, когда вы готовили {{1} } вопрос.)

2
28.01.2020, 02:46

Какой-то sed должен выполнять эту работу:

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

Если ваш файл всегда имеет одинаковое количество полей и ваш шаблон появляется в том же месте (например, столбец 72), вы можете использовать простой awk :

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

Похоже, что сопоставление с образцом вам не подходит, потому что у вас есть тот же образец (AF123456789) в начале файла.

Надеюсь, этот ответ вам поможет.

0
28.01.2020, 02:46

Теги

Похожие вопросы