Оскільки вам потрібно зіставити вміст, не включаючи його в результат (повинен збігатися, 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
до кінця команди.