Рубрики
Без рубрики

Сопоставление шаблонов JSON с sed, perl и регулярными выражениями

Автор оригинала: Vlad Mihalcea.

Почему ВИМ?

Рано или поздно наступит день, когда ваша простая в использовании среда IDE станет бесполезной для обработки огромных файлов. Существует не так много редакторов, способных работать с очень большими файлами, например, с производственными журналами.

Недавно мне пришлось проанализировать однострочный файл JSON объемом 100 МБ, и еще раз VIM спас этот день. VIM, как и многие другие утилиты Unix, одновременно сложен и великолепен.

Git interactive rebase использует VIM по умолчанию, и если вы все еще не уверены, возможно, эта отличная статья заставит вас передумать.

Давайте посмотрим, как легко вы можете распечатать файл JSON с помощью VIM. Сначала мы загрузим однострочный файл JSON с Reddit.

$ wget http://www.reddit.com/r/programming.json
--2014-01-24 12:21:04--  http://www.reddit.com/r/programming.json
Resolving www.reddit.com (www.reddit.com)... 77.232.217.122, 77.232.217.113
Connecting to www.reddit.com (www.reddit.com)|77.232.217.122|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 28733 (28K) [application/json]
Saving to: `programming.json'

100%[======================================>] 28,733      --.-K/s   in 0.03s

2014-01-24 12:21:04 (1021 KB/s) - `programming.json' saved [28733/28733]

Вот как это выглядит:

Красивая печать

Python поставляется вместе с большинством дистрибутивов Unix, поэтому выполнение следующей команды VIM позволяет выполнить трюк:

%!python -m json.tool

Давайте сохраним довольно напечатанный файл JSON и включим в работу другие инструменты Unix.

:w programming_pretty.json

Время совпадения

Допустим, мы хотим извлечь все значения, связанные с “доменом”:

"domain": "mameworld.info"

Сэд спешит на помощь

$ sed -nr 's/^.*"domain":\s*"(.*?)".*$/\1/p' 

Многострочное сопоставление

Sed ориентирован на линию, и, хотя он предлагает многострочную поддержку, он не подходит для Perl. Допустим, я хочу сопоставить всех авторов в следующем шаблоне JSON:

"data": {   
   "author": "justrelaxnow", 
}

Вот как я это делаю:

$ perl -0777 -n -e 'print "$2\n" while (m/("data":\s*\{.*?"author":\s*"(.*?)"[,|\s*\}].*?\},)/sgmp)' programming_pretty.json | sort -u
AmericanXer0
azth
bionicseraph
bit_shiftr
charles_the_hard
Gexos
jakubgarfield
johnwaterwood
joukoo
justrelaxnow
Kingvash
krets
mariuz
mopatches
nyphrex
pseudomind
rluecke3
sltkr
solidus-flux
steveklabnik1
sumstozero
swizec
vocalbit
Wolfspaw

Вывод

Инструменты Unix-это старая школа, некоторые из них были написаны сорок лет назад. Кривая обучения может быть крутой, но их изучение-отличная инвестиция. Отличная библиотека программного обеспечения выдерживает испытание временем, и инструменты Unix являются хорошим напоминанием о том, что трудная работа требует сложных инструментов.