Ponieważ musisz dopasować zawartość bez uwzględniania jej w wyniku (musi pasować, name="
ale nie jest częścią pożądanego wyniku), wymagana jest pewna forma dopasowania o zerowej szerokości lub przechwytywania grupowego. Można to łatwo zrobić za pomocą następujących narzędzi:
Perl
W Perlu możesz użyć n
opcji zapętlenia wiersz po wierszu i wydrukowania zawartości grupy przechwytywania, jeśli pasuje:
perl -ne 'print "$1\n" if /name="(.*?)"/' filename
GNU grep
Jeśli masz ulepszoną wersję grep, taką jak GNU grep, możesz mieć -P
dostępną opcję. Ta opcja włączy regex w stylu Perla, umożliwiając użycie \K
skrótu lookbehind. Zresetuje pozycję dopasowania, więc wszystko, co jest przed nią, ma zerową szerokość.
grep -Po 'name="\K.*?(?=")' filename
Ta o
opcja powoduje, że grep drukuje tylko dopasowany tekst zamiast całej linii.
Vim - edytor tekstu
Innym sposobem jest bezpośrednie użycie edytora tekstu. W Vimie jednym z różnych sposobów na osiągnięcie tego byłoby usunięcie linii bez,
name=
a następnie wyodrębnienie zawartości z linii wynikowych:
:v/.*name="\v([^"]+).*/d|%s//\1
Standardowy grep
Jeśli z jakiegoś powodu nie masz dostępu do tych narzędzi, coś podobnego można osiągnąć za pomocą standardowego grep. Jednak bez rozglądania się dookoła będzie wymagać późniejszego uporządkowania:
grep -o 'name="[^"]*"' filename
Uwaga dotycząca zapisywania wyników
We wszystkich powyższych poleceniach wyniki zostaną przesłane do stdout
. Należy pamiętać, że zawsze można je zapisać, przesyłając je do pliku, dołączając:
> result
do końca polecenia.