Части совпадения в регулярном выражении с egrep - PullRequest
3 голосов
/ 20 февраля 2010

Мне было интересно, могу ли я с помощью egrep ((GNU grep) 2.5.1) выбрать часть сопоставленного текста, например:

grep '^([a-zA-Z.-]+)[0-9]+' ./file.txt

Таким образом, я получаю только ту часть, которая совпадает между скобками, что-то вроде

house.com

Вместо всей строки, которую я обычно получаю:

house.com112

Предполагается, что в моем файле file.txt есть строка с house.com112.

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

Я знаю, в некоторых языках, таких как PHP, Perl или даже AWK, я могу, но я не знаю, смогу ли я с egrep.

Заранее спасибо!

Ответы [ 3 ]

9 голосов
/ 20 февраля 2010

Используйте sed, чтобы изменить результат после того, как grep обнаружит строки, которые соответствуют:

grep '^[a-zA-Z.-]+[0-9]+' ./file.txt | sed 's/[0-9]\+$//'

Или, если вы хотите использовать только grep, вы можете использовать grep с ключом -o вместо sed:

grep '^[a-zA-Z.-]+[0-9]+' ./file.txt | grep -o '[a-zA-Z.-]+'
2 голосов
/ 20 февраля 2010

вы можете попробовать флаги -o, -w в grep. egrep "устарел", поэтому используйте grep -E.

$ echo "test house.com house.com112"| grep -Eow "house.com"
house.com

Основная идея - пройти через каждое слово и проверить на равенство.

$ echo "test house.com house.com112"| awk '{for(i=1;i<=NF;i++){ if($i=="house.com") print $i}}'
house.com
2 голосов
/ 20 февраля 2010

Первая часть вашего регулярного выражения более общая, чем вторая половина, и, поскольку + жадный, второй [0-9] + не будет никогда ничего совпадать соответствует только последней цифре (спасибо Полу) , Если вы можете сделать свою первую половину более конкретной (например, если вы знаете, что она закончится ДВУ), вы можете сделать это.

Есть удивительно крутой инструмент под названием ack , который в основном grep с регулярными выражениями Perl. Я не уверен, возможно ли это использовать в вашем случае, но если вы можете делать то, что вы хотите в Perl, вы можете сделать это с помощью ack.

Edit:

Почему бы просто не опустить конец регулярного выражения? Есть ли ложные срабатывания, если вы делаете это? Если вы, вы можете передать результаты в egrep снова только с первой половиной регулярного выражения.

Похоже, это то, о чем вы спрашиваете: Кроме того, если вы не знаете об этом, флаг -o будет выводить только соответствующую часть данной строки.

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