2015-09-16 3 views
0

Меня немного отличает разница между «нормальным» RegEx и синтаксисом, который понимает grep. Я хотел бы попросить вас о помощи в следующем.Некоторая помощь в grep regex

У меня есть этот текст в файле «deployments.txt»:

{"data":[{"id":"local$1cb66e07-2e75-40c4-9ea7-cdda2e62a7e9","name":"some-other-app","servers":["f150ee04-6250-4b97-a2d7-f6511186b6b4"],"applications":["local$1552a8d2-4c9d-4256-b635-a15c4187f4ee"],"lastModified":"Mon, 14 Sep 2015 11:34:52.474 CEST","reconciled":false,"status":"DEPLOYED","href":"https://host123:7777/mmc-3.6.1/api/deployments/local$1cb66e07-2e75-40c4-9ea7-cdda2e62a7e9","clusterIds":[],"clusterNames":[]},{"id":"local$6b5fabb5-3e7e-4d16-9664-14977e3b1a7b","name":"interesting-app","servers":["f150ee04-6250-4b97-a2d7-f6511186b6b4"],"applications":["local$87bc69d6-1b92-4e3a-a0f2-724c5d37aeaf"],"lastModified":"Mon, 14 Sep 2015 22:43:15.440 CEST","reconciled":false,"status":"DEPLOYED","href":"https://host123:7777/mmc-3.6.1/api/deployments/local$6b5fabb5-3e7e-4d16-9664-14977e3b1a7b","clusterIds":[],"clusterNames":[]}],"total":2} 

А теперь я заинтересован в этом немного:

"id":"local$6b5fabb5-3e7e-4d16-9664-14977e3b1a7b","name":"interesting-app" 

или на самом деле только чистый идентификатор, предшествующего текст "name":"interesting-app"

А «нормальный» регулярное выражение будет: .*"id":"(.*?)","name":"interesting-app", который дает в группе захвата local$6b5fabb5-3e7e-4d16-9664-14977e3b1a7b

Но эти группы захвата работают по-разному в grep, по-видимому, догадались, что к настоящему моменту и стучали головой об этом.

Так что я получил это для Grep Сейчас:

grep -Po '(?<="id":").*?(?=","name":"interesting-app)' deployments.txt 

Но это захватывает слишком много, начните с первого "id":" он находит, а затем останавливается, когда он находит ","name":"interesting-app.

Итак, как я могу получить результат, который я хочу здесь? Я хочу, чтобы чистое значение id сразу предшествовало "name":"interesting-app".

Любая помощь очень ценится!

+0

Нет, не разбирайте 'json' с регулярным выражением. Общий формат json не обрабатывается регулярным выражением, и, кроме того, для большинства случаев, которые могут быть проанализированы, будет исключительно подвержен ошибкам. –

+0

Я понимаю и в основном соглашаюсь с вашим заявлением, но тогда как бы вы посоветовали переварить это в сценарии bash? К сожалению, у меня нет ресурсов для создания приложения с возможностями json parsing. – Denno

+2

Вы можете использовать 'jq'? –

ответ

1

jq - это гораздо лучший инструмент для разбора JSON в оболочке. Он имеет довольно мощный миниатюрный язык запросов для выбора и даже изменения данных JSON.

Взглянуть:

$ jq -r '.data | map(select(.name == "interesting-app")) | .[].id' deployments.txt 
local$6b5fabb5-3e7e-4d16-9664-14977e3b1a7b 

Чтобы объяснить, как это работает, давайте сначала посмотрим на этот простой запрос для всех id с:

$ jq -r '.data[].id' deployments.txt 
local$1cb66e07-2e75-40c4-9ea7-cdda2e62a7e9 
local$6b5fabb5-3e7e-4d16-9664-14977e3b1a7b 

Выбирает ключ data, затем [] выбирает все элементы массива, затем .id получает ключ id от каждой записи массива.

Мой первоначальный запрос добавляет в смесь фильтр select, чтобы выбрать только записи, содержащие name из "interesting-app". Оказывается, jq позволяет объединить так называемые «фильтры» с UNIX-подобными трубами.

Вы можете прочитать jq manual для полного описания всего, что может сделать jq.

+0

Спасибо за ваше предложение. Я согласен, что это было бы лучше, но я должен использовать ограниченные средства, которые у меня есть ... – Denno

0

Используйте этого простого шаблон регулярного выражения

String patt="(\\.id.*interesting-app\\.)"; 

Надеется, что это помогает

+1

Пожалуйста, не используйте регулярные выражения для разбора json, ... –

0

Является ли это вообще достаточно для вас?

grep -Po '(?<="id":")[^"]*(?=","name":"interesting-app")' deployments.txt 

Проблема с . *? заключается в том, что он соответствует всем между первым «id»: и последним «имя»: «интересное приложение».

+0

Ах, отлично! Благодаря! – Denno

Смежные вопросы