регулярное выражение для любой из двух подстрок, но предпочитает более длинную подстроку - PullRequest
1 голос
/ 22 апреля 2020

Я бы хотел соответствовать либо cde или de, но предпочел бы cde, если присутствует. Как это можно сделать в sed? например,

$ echo "abcdef" | sed -r 's/^.*(cde|de).*$/\1/' 
de
$ echo "abcdef" | sed -r 's/^.*(de|cde).*$/\1/' 
de
$ echo "abcdef" | sed -r 's/^.*(c?de).*$/\1/' 
de

Ничего из вышеперечисленного не сработало, поскольку я хочу вывести cde вместо de.

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

sed не поддерживает нежадные алгоритмы, и квантификаторы будут соответствовать крайнему левому краю, поэтому необязательный c в этом случае невозможен только с регулярным выражением. Вы можете использовать команды ветвления для этого конкретного примера.

$ # tested with GNU sed, syntax might differ for other implementations
$ # t command here will start next cycle if first s command succeeds
$ # so, the second s command will execute only if first one fails
$ printf 'abdef\nabcdef\n' | sed 's/.*cde.*/cde/; t; s/.*de.*/de/'
de
cde


Вы также можете использовать grep, если он поддерживает опцию -o (печатать только соответствующие части)

$ printf 'abdef\nabcdef\n' | grep -oE 'c?de'
de
cde
1 голос
/ 22 апреля 2020

Perl поддерживает не жадные:

echo "abcdef" | perl -p -e 's/^.*?(c?de).*$/\1/'

Вывод:

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