Вывести все совпадения регулярного выражения из командной строки? - PullRequest
4 голосов
/ 07 июня 2011

Какой самый простой способ вывести все совпадения (одну строку на совпадение или одну строку на строку ввода) в регулярное выражение в командной строке unix? Обратите внимание, что в строке ввода может быть 0 или более 1 совпадений.

Я предполагаю, что должен быть какой-то способ сделать это с помощью sed, awk, grep и / или perl, и я надеюсь на простое решение командной строки, чтобы оно появилось в моей истории bash при необходимости в будущем. .

РЕДАКТИРОВАТЬ: Чтобы уточнить, я не хочу печатать все совпадающие строки, только совпадения с регулярным выражением. Например, строка может содержать 1000 символов, но регулярному выражению соответствует только два 10-символьных соответствия. Меня интересуют только эти два 10-символьных матча.

Ответы [ 4 ]

13 голосов
/ 07 июня 2011

Предполагая, что вы используете только скобки без записи,

perl -wnE'say /yourregex/g'

или

perl -wnE'say for /yourregex/g'

Пример использования:

$ echo -ne 'fod,food,fad\nbar\nfooooood\n' | perl -wnE'say for /fo*d/g'
fod
food
fooooood
$ echo -ne 'fod,food,fad\nbar\nfooooood\n' | perl -wnE'say /fo*d/g'
fodfood

fooooood
6 голосов
/ 07 июня 2011

Если я не пойму ваш вопрос, то сработает следующее:

grep -o 'fo.*d' input.txt

Подробнее см .:

1 голос
/ 07 июня 2011
perl -MSmart::Comments -ne '@a=m/(...)/g;print;' -e '### @a'
1 голос
/ 07 июня 2011

Выходя из комментария, и предполагая, что вы передали входные данные из канала или иным образом на STDIN:

perl -e 'my $re=shift;$re=~qr{$re};while(<STDIN>){if(/($re)/g){print"$1\n"}while(m/\G.*?($re)/g){print"$1\n"}}'

Использование:

cat SOME_TEXT_FILE | perl -e 'my $re=shift;$re=~qr{$re};while(<STDIN>){if(/($re)/g){print"$1\n"}while(m/\G.*?($re)/g){print"$1\n"}}' 'YOUR_REGEX'

или я бы просто добавил весь этот беспорядок в функцию bash ...

bggrep ()
{
    if [ "x$1" != "x" ]; then
        perl -e 'my $re=shift;$re=~qr{$re};while(<STDIN>){if(/($re)/g){print"$1\n"}while(m/\G.*?($re)/g){print"$1\n"}}' $1;
    else
        echo "Usage: bggrep <regex>";
    fi
}

Использование такое же, только выглядит чище:

cat SOME_TEXT_FILE | bggrep 'YOUR_REGEX'

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

Пример (из вашего комментария):

bash$ cat garbage
fod,food,fad
bar
fooooooood
bash$ cat garbage | perl -e 'my $re=shift;$re=~qr{$re};while(<STDIN>){if(/($re)/g){print"$1\n"}while(m/\G.*?($re)/g){print"$1\n"}}' 'fo*d'
fod
food
fooooooood

или ...

bash$ cat garbage | bggrep 'fo*d'
fod
food
fooooooood
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...