Использование регулярных выражений в скрипте оболочки - PullRequest
24 голосов
/ 28 октября 2009

Как правильно проанализировать строку с помощью регулярных выражений в сценарии оболочки linux? Я написал следующий скрипт для печати моего представителя SO на консоли, используя curl и sed (не только потому, что я сумасшедший - я пытаюсь изучить некоторые сценарии оболочки и регулярное выражение перед переключением на linux).

json=$(curl -s http://stackoverflow.com/users/flair/165297.json)
echo $json | sed 's/.*"reputation":"\([0-9,]\{1,\}\)".*/\1/' | sed s/,//

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

{"displayName": "Amarghosh", "Reputation": "2,737", "badgeHtml": "\ u003cspan title = \" 1 серебряный значок \ "\ u003e \ u003cspan class = \" badge2 \ "\ u003e ● \ u003c / span \ u003e \ u003cspan class = \ "badgecount \" \ u003e1 \ u003c / span \ u003e \ u003c / span \ u003e "}

Я думаю, мои вопросы:

  • Как правильно проанализировать строку с помощью регулярных выражений в сценарии оболочки linux?
  • sed Правильно ли здесь использовать?
  • Можно ли это сделать с помощью grep?
  • Есть ли какая-нибудь другая команда, которая более проста / уместна?

Ответы [ 11 ]

0 голосов
/ 28 октября 2009

Вслепую:

echo $json | awk -F\" '{print $8}'

Аналог (разделитель полей может быть регулярным выражением):

awk -F'{"|":"|","|"}' '{print $5}'

Умнее (найдите ключ и напечатайте его значение):

awk -F'{"|":"|","|"}' '{for(i=2; i<=NF; i+=2) if ($i == "reputation") print $(i+1)}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...