Часть Вашего ответа зависит, на каком языке Вы используете. Я знаю, что в Python, довольно просто переместить процессуальный кодекс в класс или более формальный объект.
Одна из моей эвристики на основе того, как "состояние" ситуации. Если процедура загрязняет пространство имен или могла бы возможно влиять на глобальное состояние (плохим, или непредсказуемым способом), то инкапсуляция той функции в объекте или классе, вероятно, мудра.
Команда grep
выберет нужную строку (строки) из многих, но не будет напрямую управлять строкой. Для этого вы используете sed
в конвейере:
someCommand | grep 'Amarghosh' | sed -e 's/foo/bar/g'
В качестве альтернативы можно использовать awk
(или perl
, если он доступен). На мой взгляд, это гораздо более мощный инструмент для обработки текста, чем sed
.
someCommand | awk '/Amarghosh/ { do something }'
Для простых манипуляций с текстом просто используйте комбинацию grep / sed
. Если вам нужна более сложная обработка, переходите к awk
или perl
.
Моя первая мысль - просто использовать:
echo '{"displayName":"Amarghosh","reputation":"2,737","badgeHtml"'
| sed -e 's/.*tion":"//' -e 's/".*//' -e 's/,//g'
, который сохраняет число sed
обрабатывает один (вы можете дать несколько команд с помощью -e
).
Возможно, вам будет интересно использовать Perl для таких задач. В качестве демонстрации вот сценарий Perl, который печатает нужное вам число:
#!/usr/local/bin/perl
use warnings;
use strict;
use LWP::Simple;
use JSON;
my $url = "http://stackoverflow.com/users/flair/165297.json";
my $flair = get ($url);
my $parsed = from_json ($flair);
print "$parsed->{reputation}\n";
Этот сценарий требует, чтобы вы установили модуль JSON, что можно сделать с помощью только команды cpan JSON
.
Установка таблицы separatorStyle
в UITableViewCellSeparatorStyleNone
(в коде или в IB) должен помочь.
tail
, head
для хранения последней или первой строки файла Вы можете сделать это с помощью grep. В grep witch есть переключатель -o, который извлекает только соответствующую строку, а не всю строку.
$ echo $json | grep -o '"reputation":"[0-9,]\+"' | grep -o '[0-9,]\+'
2,747
sed
подходит, но вы создадите новый процесс для каждого sed
, которое вы используете (что может быть слишком тяжелым в более сложных сценариях). grep
не совсем подходит. Это инструмент поиска, который использует регулярные выражения для поиска интересующих строк.
Perl является одним из подходящих решений, поскольку он является языком сценариев оболочки с мощными функциями регулярного выражения. Он сделает почти все, что вам нужно, не создавая отдельных процессов (в отличие от обычных сценариев оболочки Unix), и имеет огромную библиотеку дополнительных функций.
Слепо:
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)}'
sed
- вполне допустимая команда для вашей задачи, но, возможно, не единственная.
grep
тоже может быть полезен, но, как вы говорите, он печатает вся линия. Это наиболее полезно для фильтрации строк многострочного файла и отбрасывания строк, которые вам не нужны.
Эффективные сценарии оболочки могут использовать комбинацию команд (а не только две, которые вы упомянули), используя таланты каждой из них. .
Для работы с JSON в сценарии оболочки используйте jsawk , который похож на awk, но для JSON .
json=$(curl -s http://stackoverflow.com/users/flair/165297.json)
echo $json | jsawk 'return this.reputation' # 2,747
1) Как правильно анализировать строку с использованием регулярных выражений в сценарии оболочки Linux?
Инструменты, которые включают возможности регулярных выражений, включают sed, grep, awk, Perl, Python, чтобы упомянуть несколько. Даже более новая версия Bash имеет возможности регулярных выражений. Все, что вам нужно сделать, это посмотреть документацию о том, как их использовать.
2) Подходит ли здесь sed?
Можно, но не обязательно.
3) Можно ли это сделать. с помощью grep?
Да, может. вы просто создадите такое же регулярное выражение, как если бы вы использовали sed или другие. Обратите внимание, что grep просто делает то, что делает, и если вы хотите изменить какие-либо файлы, он не сделает этого за вас.
4) Есть ли другая команда, которая проще / более подходящая?
Конечно. регулярное выражение может быть мощным, но не всегда лучшим инструментом для использования. Другой метод, который можно использовать с минимальной суетой в регулярном выражении, - это использовать подход полей / разделителей. вы ищете шаблоны, которые можно «расколоть». например, в вашем случае (я загрузил файл 165297.json вместо использования curl .. (но это то же самое)
awk 'BEGIN{
FS="reputation" # split on the word "reputation"
}
{
m=split($2,a,"\",\"") # field 2 will contain the value you want plus the rest
# Then split on ":" and save to array "a"
gsub(/[:\",]/,"",a[1]) # now, get rid of the redundant characters
print a[1]
}' 165297.json
output:
$ ./shell.sh
2747
Вы можете использовать подходящую библиотеку (как отмечали другие):
E: \ Home> perl -MLWP :: Simple -MJSON -e "print from_json (get 'http://stackoverflow.com/users/flair /165297.json')->{reputation}"[121ptingor
$ perl -MLWP :: Simple -MJSON -e 'print from_json (получить "http://stackoverflow.com/users/flair/165297. json ") -> {replication}," \ n "'
в зависимости от комбинации ОС / оболочки.