Части соответствия в регулярном выражении с egrep

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

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

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

house.com

Вместо целой строки как я обычно добираюсь:

house.com112

Принятие у меня есть строка с домом com112 в моем file.txt.

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

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

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

5
задан José M. Gilgado 20 February 2010 в 00:09
поделиться

3 ответа

Используйте 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.-]+'
10
ответ дан 18 December 2019 в 09:49
поделиться

возможно, вы захотите попробовать флаги -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
3
ответ дан 18 December 2019 в 09:49
поделиться

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

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

Изменить:

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

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

3
ответ дан 18 December 2019 в 09:49
поделиться
Другие вопросы по тегам:

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