Используя регулярные выражения в сценарии оболочки

Часть Вашего ответа зависит, на каком языке Вы используете. Я знаю, что в Python, довольно просто переместить процессуальный кодекс в класс или более формальный объект.

Одна из моей эвристики на основе того, как "состояние" ситуации. Если процедура загрязняет пространство имен или могла бы возможно влиять на глобальное состояние (плохим, или непредсказуемым способом), то инкапсуляция той функции в объекте или классе, вероятно, мудра.

24
задан Amarghosh 28 October 2009 в 10:21
поделиться

10 ответов

Команда 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 ).

12
ответ дан 28 November 2019 в 23:52
поделиться

Возможно, вам будет интересно использовать 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 .

8
ответ дан 28 November 2019 в 23:52
поделиться

Установка таблицы separatorStyle в UITableViewCellSeparatorStyleNone (в коде или в IB) должен помочь.

) синтаксис для доступа к переменным
  • tail , head для хранения последней или первой строки файла
  • 3
    ответ дан 28 November 2019 в 23:52
    поделиться

    Вы можете сделать это с помощью grep. В grep witch есть переключатель -o, который извлекает только соответствующую строку, а не всю строку.

    $ echo $json | grep -o '"reputation":"[0-9,]\+"' | grep -o '[0-9,]\+'
    2,747
    
    2
    ответ дан 28 November 2019 в 23:52
    поделиться

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

    Perl является одним из подходящих решений, поскольку он является языком сценариев оболочки с мощными функциями регулярного выражения. Он сделает почти все, что вам нужно, не создавая отдельных процессов (в отличие от обычных сценариев оболочки Unix), и имеет огромную библиотеку дополнительных функций.

    2
    ответ дан 28 November 2019 в 23:52
    поделиться

    Слепо:

    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)}'
    
    0
    ответ дан 28 November 2019 в 23:52
    поделиться

    sed - вполне допустимая команда для вашей задачи, но, возможно, не единственная.

    grep тоже может быть полезен, но, как вы говорите, он печатает вся линия. Это наиболее полезно для фильтрации строк многострочного файла и отбрасывания строк, которые вам не нужны.

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

    1
    ответ дан 28 November 2019 в 23:52
    поделиться

    Для работы с JSON в сценарии оболочки используйте jsawk , который похож на awk, но для JSON .

    json=$(curl -s http://stackoverflow.com/users/flair/165297.json)
    echo $json | jsawk 'return this.reputation' # 2,747
    
    5
    ответ дан 28 November 2019 в 23:52
    поделиться

    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
    
    2
    ответ дан 28 November 2019 в 23:52
    поделиться

    Вы можете использовать подходящую библиотеку (как отмечали другие):

    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 "'

    в зависимости от комбинации ОС / оболочки.

    0
    ответ дан 28 November 2019 в 23:52
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: