Как сопоставить регулярное выражение от 1 до 3 раз в команде sed? - PullRequest
4 голосов
/ 05 августа 2020

Проблема

Я хочу получить любой текст, состоящий из от 1 до трех цифр, за которыми следует% , но без % , используя sed .

Что я пробовал

Итак, я думаю, следующее регулярное выражение должно соответствовать правильному шаблону: [0-9]{1,3}%.
Затем я могу использовать эту команду sed, чтобы поймать три цифры и только распечатать их:
sed -nE 's/.*([0-9]{1,3})%.*/\1/p'

Пример

Однако, когда я запускаю ее, она показывает:

$ echo "100%" | sed -nE 's/.*([0-9]{1,3})%.*/\1/p'
0

вместо

100

Очевидно, что-то не так с моей командой sed, и я думаю, что проблема исходит отсюда:

[0-9]{1,3}

, что, по-видимому, не делает то, что я хочу.

редактировать:

Решение

.* в начале sed -nE 's/.*([0-9]{1,3})%.*/\1/p' "съел" две первые цифры .

Правильный способ написать это, согласно ответу Виктора:

sed -nE 's/(.*[^0-9])?([0-9]{1,3})%.*/\2/p'

Ответы [ 3 ]

4 голосов
/ 05 августа 2020

.* захватывает все цифры, оставляя только последнюю из трех цифр в 100%.

Используйте

sed -nE 's/(.*[^0-9])?([0-9]{1,3})%.*/\2/p'

Подробности

  • (.*[^0-9])? - (Группа 1) необязательная последовательность любых 0 или более символов вплоть до символа, отличного от di git, включая его
  • ([0-9]{1,3}) - (Группа 2) от одного до три цифры
  • % - a % char
  • .* - остальная часть строки.

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

3 голосов
/ 05 августа 2020

Будет проще использовать параметр cut + grep:

echo "abc 100%" | cut -d% -f1 | grep -oE '[0-9]{1,3}'
100

echo "100%" | cut -d% -f1 | grep -oE '[0-9]{1,3}'
100

Или вы можете использовать это awk:

echo "100%" | awk 'match($0, /[0-9]{1,3}%/){print substr($0, RSTART, RLENGTH-1)}'
100

Или, если у вас есть gnu grep затем используйте вариант -P (PCRE):

echo "abc 100%" | ggrep -oP '[0-9]{1,3}(?=%)'
100
1 голос
/ 05 августа 2020

Это может сработать для вас (GNU sed):

sed -En 's/.*\<([0-9]{1,3})%.*/\1/p' file

Это упражнение по фильтрации, поэтому используйте параметр -n.

Используйте обратную ссылку для захвата 1 в 3 цифры, затем % и в случае успеха распечатать результат.

NB \< гарантирует, что цифры начинаются на границе слова, \b также можно использовать. Параметр -E используется для уменьшения количества обратных косых черт, которые обычно необходимы для цитирования метасимволов (, ), { и }.

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