Как разобрать только вывод, чтобы быть как да или нет, все остальные игнорировать? - PullRequest
0 голосов
/ 19 марта 2012

Как я могу вывести только то, что да или нет, пропуская что-либо?

Ответы [ 4 ]

2 голосов
/ 19 марта 2012

Это работает:

LANG=C pactl list sources | perl -0 -lne'print $1 if /Name: alsa_input.usb.analog-mono\n(?:\N+\n){5}\s+Mute: (yes|no)/ms'

Но вам нужно правильно проанализировать это, вы не можете полагаться на то, что строка отключения звука всегда идет ровно через 6 строк.

2 голосов
/ 19 марта 2012
perl -M5.010 -ne 'say $1 if m/\s(yes|no)$/i'
2 голосов
/ 19 марта 2012

Ваше perl выражение нарушено.Наблюдайте:

$ echo "Mute: no" | perl -p -i -e 's/.+\\s(yes|no)$//'
Mute: no

Это ничего не делает!Причина, по которой он ничего не делает, состоит в том, что ничто не соответствует.Почему бы и нет?Потому что вы излишне сбежали \s.Правильное выражение должно быть s/.+\s(yes|no)$/$1/.Обратите внимание на единственный \, предшествующий s.

. С этим новым выражением мы получим:

$ echo "Mute: no" | perl -p -i -e 's/.+\s(yes|no)$/$1/'
no
$ echo "Mute: yes" | perl -p -i -e 's/.+\s(yes|no)$/$1/'
yes

Обратите внимание, что это по-прежнему не делает то, что вы хотите, потому что если ничего не соответствует,вся линия излучается как есть.Например:

$ echo "Mute: monkies" | perl -p -e 's/.+\s(yes|no)$/$1/'
Mute: monkies

Хотя это возможно решить с помощью более сложного регулярного выражения, я не буду этого делать.Вместо этого я процитирую следующее:

Иногда, когда люди видят проблему, они думают про себя: «Я знаю, я буду использовать регулярное выражение».Теперь у них две проблемы.

1 голос
/ 19 марта 2012

с точки зрения Perl:

perl -p -i -e 's/.+\\s(yes|no)$/$1/is'

Пожалуйста, введите необработанный ввод и что вы хотите достичь (ожидаемый вывод)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...