Поскольку вам необходимо сопоставить контент, не включив его в результат (должен соответствовать name="
, но это не является частью желаемого результата), требуется некоторая форма сопоставления нулевой ширины или захвата группы.Это можно легко сделать с помощью следующих инструментов:
Perl
С Perl вы можете использовать опцию n
, чтобы построчно циклически выводить и выводить содержимое группы захвата, если она совпадает:
perl -ne 'print "$1\n" if /name="(.*?)"/' filename
GNU grep
Если у вас есть улучшенная версия grep, такая как GNU grep, у вас может быть доступна опция -P
.Эта опция активирует Perl-подобное регулярное выражение, позволяя вам использовать \K
, что является сокращенным представлением.Он сбрасывает позицию совпадения, поэтому все, что находится до нулевой ширины.
grep -Po 'name="\K.*?(?=")' filename
Опция o
позволяет grep печатать только сопоставленный текст, а не всю строку.
Vim - текстовый редактор
Другой способ - использовать текстовый редактор напрямую.В Vim один из различных способов сделать это - удалить строки без name=
, а затем извлечь содержимое из результирующих строк:
:v/.*name="\v([^"]+).*/d|%s//\1
Стандартный grep
Если по какой-то причине у вас нет доступа к этим инструментам, чего-то подобного можно добиться с помощью стандартного grep.Тем не менее, без осмотра это потребует некоторой очистки позже:
grep -o 'name="[^"]*"' filename
Примечание о сохранении результатов
Во всех вышеприведенных командах результаты будут отправлены на stdout
.Важно помнить, что вы всегда можете сохранить их, отправив их в файл, добавив:
> result
в конец команды.