Почему регулярное выражение [0-9]{0,2} не является жадным в sed?

Agregue un widget llamado "Menú global" para su Panel de plasma y elimine el botón de la barra de título. El menú global de KDE desapareció

3
20.07.2019, 14:09
1 ответ

Задача, как утверждает стилдрайвер , разве [0-9]{0,2}не является -жадным; проблема в том, что .*?перед этим жадный. sed поддерживает BRE и ERE, ни один из которых не поддерживает не-жадное сопоставление. Это особенность PCRE. Например, следующие команды:

$ echo 'aQbQc' | sed    's/.*\?Q/X/'
$ echo 'aQbQc' | sed    's/.*Q/X/'
$ echo 'aQbQc' | sed -r 's/.*?Q/X/'
$ echo 'aQbQc' | sed -r 's/.*Q/X/'

весь вывод

Xc

(Я не уверен, почему он просто игнорирует ?.)

См. Не жадное совпадение -с регулярным выражением SED (Эмуляция Perl.*?).

Ваше описание функции, которую вы хотите выполнить, является скудным, но я считаю, что я перепроектировал это. Вы можете получить желаемый эффект, не сопоставляя символы перед номером, который вы хотите сопоставить, до тех пор, пока вы не найдете номер:

$ echo '123980925sriten34=ienat' | sed -e 's/\([1-9][0-9]\{0,2\}\+\)\([%=+-]\).*/! \1 \2 /' -e 's/.*!//'
 34 =

замена !любой строкой, которая, как известно, не появляется во входных данных. Если у вас нет такой строки, но вы используете GNU sed, вы можете использовать новую строку:

$ echo '123980925sriten34=ienat' | sed -e 's/\([1-9][0-9]\{0,2\}\+\)\([%=+-]\).*/\n \1 \2 /' -e 's/.*\n//'
 34 =

, что, конечно, не может появитьсявни в одной строке.

11
27.01.2020, 21:09

Теги

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