Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Sed: как вывести информацию между двумя словами?  (Прочитано 296 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Lefeofan

  • Автор темы
  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
Здравствуйте. Разбираюсь с sed, споткнулся об синтаксис. Парсю в файл get запросом с сайта, мне вываливается информация, надо из неё выбрать определенное значение между двумя словами. Пытаюсь делать через sed.

 info=$(sed 's/слово1"\(.*\)слово2/\//' file.txt) Но строка длинная, и слова находятся не по краям, поэтому мне выдается всё кроме этих двух слов. Как получить изолировано только то что между этими словами? Например, вот текст например

{"id":3876,"form":"index","time":21,"data":"2529423","service":"Atere","response":"WAIT"} Как из него вычленить только то что между «data» и «service». Man читаю, но не выходит.

Пробовал такую конструкцию из мана

sed -n '/Iowa/,/Montana/p' # чувствительно к регистру
Всё равно не выводит!

Оффлайн ALiEN175

  • Старожил
  • *
  • Сообщений: 1099
    • Просмотр профиля
sed 's/.*data//g; s/service.*//g'(удаляем все до data и удаляем все после service включительно)

более короткий вариант:
sed 's/.*data\|service.*//g'
« Последнее редактирование: 09 Октябрь 2017, 21:06:27 от ALiEN175 »
415243484c494e5558

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5243
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Код: Bash
  1. sed '/\n/P;s/data/\n/g;s/service/\n/g;D'
Если исправить Ваш вариант то
Код: Bash
  1. sed 's/.*слово1"\(.*\)слово2.*/\1/' file.txt
Но, исходя из представленного образца, надо значение поля «data»?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн agtrif

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
тут https://gist.github.com/cjus/1047794 один из парсингов json

как-то так можно получить универсальный код

#!/bin/bash

function jsonval {
temp=`echo $json | sed 's/\\\\\//\//g' | sed 's/[{}]//g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | sed 's/\"\:\"/\|/g' | sed 's/[\,]/ /g' | sed 's/\"//g' | grep -w $prop| cut -d":" -f2| sed -e 's/^ *//g' -e 's/ *$//g'`
echo ${temp##*|}
}


# тут json - строка
json={"id":3876,"form":"index","time":21,"data":"2529423","service":"Atere","response":"WAIT"}


echo значение ключа data
prop='data'
jsonval

echo значение ключа time
prop='time'
jsonval

echo значение ключа service
prop='service'
jsonval



Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5243
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
универсальный код
Один из самых корявых и отвратительных из виденных мной…
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн agtrif

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
наверное, есть много других. Даже по ссылке есть несколько других вариантов.
Не пинайте особо не силен в sed. Но мне пригодился, правда, для одноразовой работы.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5243
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Код: Python
  1. #!/usr/bin/python3
  2. d={"id":3876,"form":"index","time":21,"data":"2529423","service":"Atere","response":"WAIT"}
  3. for i in d:
  4.     print(i, d[i])
А так есть «вагон и маленькая тележка» парсеров…
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн renzrv

  • Старожил
  • *
  • Сообщений: 1735
    • Просмотр профиля
Как из него вычленить только то что между «data» и «service»
Зачем "между" если формат ключ:значение ?

Получить значение service:
sed -rn 's/.*"service":"?([^",]+)"?.*/\1/p'
Через переменные:
Код: Bash
  1. KEY=service
  2. VALUE="$(echo "$DATA" | sed -rn 's/.*"'${KEY}'":"?([^",]+)"?.*/\1/p')"

$DATA - строка или строки с данными json.

 

Страница сгенерирована за 0.184 секунд. Запросов: 23.