Poiché è necessario abbinare il contenuto senza includerlo nel risultato (deve corrispondere name="
ma non fa parte del risultato desiderato) è necessaria una qualche forma di corrispondenza a larghezza zero o cattura di gruppo. Questo può essere fatto facilmente con i seguenti strumenti:
Perl
Con Perl potresti usare l' n
opzione per ripetere il ciclo riga per riga e stampare il contenuto di un gruppo di cattura se corrisponde:
perl -ne 'print "$1\n" if /name="(.*?)"/' filename
GNU grep
Se hai una versione migliorata di grep, come GNU grep, potresti avere l' -P
opzione disponibile. Questa opzione abiliterà regex simile a Perl, permettendoti di usare \K
una scorciatoia. Ripristinerà la posizione della corrispondenza, quindi qualsiasi cosa prima che sia di larghezza zero.
grep -Po 'name="\K.*?(?=")' filename
L' o
opzione fa in modo che grep stampi solo il testo corrispondente, invece dell'intera riga.
Vim - Editor di testo
Un altro modo è usare direttamente un editor di testo. Con Vim, uno dei vari modi per ottenere ciò sarebbe eliminare le righe senza
name=
e quindi estrarre il contenuto dalle righe risultanti:
:v/.*name="\v([^"]+).*/d|%s//\1
Grep standard
Se non hai accesso a questi strumenti, per qualche motivo, qualcosa di simile potrebbe essere ottenuto con grep standard. Tuttavia, senza guardarsi intorno, sarà necessaria una pulizia successiva:
grep -o 'name="[^"]*"' filename
Una nota sul salvataggio dei risultati
In tutti i comandi sopra i risultati verranno inviati a stdout
. È importante ricordare che puoi sempre salvarli collegandoli a un file aggiungendo:
> result
alla fine del comando.