2013-08-22 3 views
0

Я приведу пример, чтобы проиллюстрировать мою проблему. Предположим, у нас есть имя файла «file.txt», который содержит следующую строку:Как сопоставить не string в gnu grep

AooYoZooYZoAoooooYZ

Я хотел бы использовать Grep, чтобы найти все подстроки, которые начинаются с «A» и заканчиваются «YZ», но не содержат «YZ» между «A» и «YZ». Нужный результат будет:

AooYoZooYZ

AoooooYZ

Моя догадка сделать следующее:

$ Grep -E -o «A [^ (YZ)] * YZ 'file.txt

Но выход только:

AoooooYZ

Я хотел бы скобки, чтобы держать их значение для YZ, но я читал в руководстве GNU Grep (http://www.gnu.org/software/grep/manual/grep.html), что: «Большинство мета-символы теряют свое особое значение в скобки ". Я также попытался:

$ Grep -E -o «A. * YZ file.txt

Но это выводит всю строку:

AooYoZooYZoAoooooYZ

Есть ли способ переопределить этот или другой способ решения моей проблемы?

ответ

0

Может быть, вы можете использовать не жадный матч, который может быть использован в Perl регулярное выражение

echo 'AooYoZooYZoAoooooYZ' | grep -P -o 'A.*?YZ' 

Однако, обратите внимание, что руководство по GNU Grep говорит, что опция -P является экспериментальной.

+0

Это сработало. Нашел хороший пример, объясняющий нежелезное сопоставление здесь, поскольку это было ново для меня: http://www.regular-expressions.info/repeat.html – ddetone