LINUX.ORG.RU
решено ФорумAdmin

Регулярное выражение grep для пары «key»:«value»

 ,


0

1

Пожалуйста, помогите написать regex.

Есть набор ключей и их значений, Ключи и значения разделены двоеточием, каждая пара разделена запятой. И ключ, и значение обрамлены кавычками. Не могу выдернуть одну пару.Например, нужно выдернуть значение ключа fghid.

Пример:

«abcd»:«ghjkghjkg»,«fghid»:«hjkhjkl1231312»,«gjhghj12»:«sdadhajkl»,«1231»:«sdad»

Спасибо.



Последнее исправление: rusya_rr (всего исправлений: 1)

Ответ на: комментарий от CrossFire

Не получается.

echo '"abcd":"ghjkghjkg","fghid":"hjkhjkl1231312","gjhghj12":"sdadhajkl","1231":"sdad"' |grep -oE '"fghid":"(.*?)"'

"fghid":"hjkhjkl1231312","gjhghj12":"sdadhajkl","1231":"sdad"

rusya_rr
() автор топика
Ответ на: комментарий от rusya_rr

А если grep -oP? Просто дело в том, что регэксп правильный, но нужно получить значение Capturing group, а не все попавшее выражение.

CrossFire ★★★★★
()
Последнее исправление: CrossFire (всего исправлений: 1)
Ответ на: комментарий от CrossFire
 echo '"abcd":"ghjkghjkg","fghid":"hjkhjkl1231312","gjhghj12":"sdadhajkl","1231":"sdad"' |grep -oP '"fghid":"(.*)"'
"fghid":"hjkhjkl1231312","gjhghj12":"sdadhajkl","1231":"sdad"
rusya_rr
() автор топика

Я что-то не так понял?

grep "\"..*\":\"..*\""
Уточните по поводу эквивалентности ключа и значения, и что может содержаться в кавычках и в каком количестве. На сколько важны пробелы.

kalterfive ★★
()
Ответ на: комментарий от kalterfive

Знаем имя ключа, нужно узнать его значение, либо дернуть пару ключ-значение. Значение ключа не совпадает с именем ключа. В кавычках - строка неизвестной длины, могущая содержать буквы русского и латинского алфавита, строчные и прописные, цифры, пробел, подчеркивание и тире.

rusya_rr
() автор топика
Ответ на: комментарий от rusya_rr

Не уточнили по поводу длинны значения и ключа (может ли быть она нулевой), и по поводу беспорядочных пробелов (в начала или в конце строки, между символом двоеточия).

~ $> cat simplemap 
"first":"4567890"
"second":"SasdasAD112-_"
"third":"DfsdFSD"
"other":"sdsad"
~ $> cat simplemap | grep "\"second\":\"..*\"" | awk -F\" '{print($4);}'
SasdasAD112-_
Вместо second подставляем нужный ключ.

kalterfive ★★
()
Ответ на: комментарий от kalterfive

Значение может быть пустым, ключ - нет. Пробелы могут быть только в значении. Значение не может начинаться или оканчиваться пробелом.

С awk или cut - неспортивно. Так я и сам могу. Нужен регулярник, если это возможно.

rusya_rr
() автор топика
echo '"abcd":"ghjkghjkg","fghid":"hjkhjkl1231312","gjhghj12":"sdadhajkl","1231":"sdad"' | perl -pe 's/.*"fghid":"(.*?)".*/\1/'
hjkhjkl1231312
anonymous
()
Ответ на: комментарий от rusya_rr

Есть мнение что grep не поддерживает non-greedy wildcards. Можно извратом с несколькими грепами через пайп решить проблему тогда.

anonymous
()
Ответ на: комментарий от rusya_rr

Что значит для одного значения? Оно вроде и так только значение на выход дает (без ключа).

anonymous
()
Ответ на: комментарий от anonymous
grep -Po '"fghid":".*?"'

достает пару ключ-значение. Остальное - это уже обрезания, которые проще сделать cut или awk.

А давай напишем один регулярник, который сразу выбирает значение, идущее после fghid? Без конвееров?
rusya_rr
() автор топика
Ответ на: комментарий от rusya_rr

Ты все равно вынужден будешь указать ключ, и поэтому он попадет в вывод grep. После этого надо профильтровать этот вывод и получить значение для ключа.

anonymous
()
Ответ на: комментарий от rusya_rr

А давай напишем один регулярник, который сразу выбирает значение, идущее после fghid? Без конвееров?

echo '"abcd":"ghjkghjkg","fghid":"hjkhjkl1231312","gjhghj12":"sdadhajkl","1231":"sdad"' | grep -Po '"fghid":"\K.*?(?=")'  


Ты все равно вынужден будешь указать ключ, и поэтому он попадет в вывод grep.

Это не так.

prischeyadro ★★★☆☆
()

$ echo '"key 1":"value 1","key 2":"value 2","key 3":"value 3"' | tr ',' '\n' | awk -F':' -v k='"key 2"' '$1 == k {print k"="$2}'

"key 2"="value 2"

anonymous
()
echo '"key 1":"value 1","key 2":"value 2","key 3":"value 3"' | awk 'BEGIN{RS=","} /key 2/{print $0}'
pod ★★
()
Последнее исправление: pod (всего исправлений: 1)

Парни, всем спасибо.

rusya_rr
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.