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


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

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

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' # чувствительно к регистру
Всё равно не выводит!

Оффлайн ALiEN

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

более короткий вариант:
sed 's/.*data\|service.*//g'
« Последнее редактирование: 09 Октября 2017, 20:06:27 от ALiEN175 »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн Azure

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

Оффлайн agtrif

  • Любитель
  • *
  • Сообщений: 60
    • Просмотр профиля
тут 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

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

Оффлайн agtrif

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

Оффлайн Azure

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

Оффлайн ReNzRv

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

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

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

 

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