utilizzando sed
:
sed 's/^[^"]*"\([^"]*\)".*/\1/'
Quello che cerca: all'inizio della linea, una serie di non citazioni, una doppia citazione, cattura una serie di non citazioni, una doppia citazione e qualsiasi altra cosa sulla linea, e la sostituisce con il materiale catturato.
$ sed 's/^[^"]*"\([^"]*\)".*/\1/' <<'EOF'
> xyz... rsync: "/home/path/to/file": Permission denied (13) rsync:
> "/home/path/to/file1": Permission denied (13) rsync:
> "/home/path/to/file2": Permission denied (13) rsync:
> "/home/path/to/file3": Permission denied (13)
> EOF
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
$
Prova su RHEL 5 Linux con GNU sed
, ma utilizzando solo le funzionalità che avrebbero funzionato nella versione UNIX ™ della 7 ° edizione di sed
.
Per inciso, un modo leggermente più semplice per farlo è con due comandi sostitutivi; cambia tutto fino a includere la prima virgoletta doppia su una stringa vuota (questa è una sequenza di zero o più virgolette seguite da una virgola doppia); cambia tutto dopo quello che è ora il primo doppio preventivo a zero:
sed 's/^[^"]*"//; s/".*//'
Per inciso, il comando che hai provato (`sed -n '/" /, / "/ p') stampa da una riga contenente una virgola doppia alla riga successiva contenente una virgoletta doppia, senza modificare le righe. Questo era il motivo per cui non sembrava funzionare per te: ha fatto ciò che hai chiesto, ma ciò che gli hai chiesto di fare non era quello che intendevi chiederlo.
Per quanto riguarda l'efficienza, è improbabile che ci sia una differenza misurabile nelle prestazioni. In termini di facilità di manutenzione, sospetto che quest'ultimo sia meno oneroso per le cellule cerebrali.