En utilisant sed
:
sed 's/^[^"]*"\([^"]*\)".*/\1/'
Cela recherche: début de ligne, une série de non-guillemets, un guillemet double, capture une série de non-guillemets, un guillemet double et tout autre élément sur la ligne, et le remplace par le matériau capturé.
$ 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
$
Testez sur RHEL 5 Linux avec GNU sed
, mais uniquement en utilisant des fonctionnalités qui auraient fonctionné dans la version UNIX ™ de la 7e édition sed
.
Soit dit en passant, une façon légèrement plus simple de le faire est d'utiliser deux commandes de substitution; changer tout jusqu'à et y compris le premier guillemet double en une chaîne vide (c'est une séquence de zéro ou plusieurs non guillemets suivie d'un guillemet double); changer tout après ce qui est maintenant la première citation double à rien:
sed 's/^[^"]*"//; s/".*//'
Par ailleurs, la commande que vous avez essayée (`sed -n '/" /, / "/ p') imprime d'une ligne contenant un guillemet double à la ligne suivante contenant un guillemet double, sans modifier les lignes du tout. C'est pourquoi cela n'a pas semblé fonctionner pour vous - il a fait ce que vous avez demandé, mais ce que vous lui avez demandé de faire n'était pas ce que vous aviez l'intention de lui demander de faire.
En termes d'efficacité, il est peu probable qu'il y ait une différence mesurable dans les performances. En termes de facilité d'entretien, je soupçonne que ce dernier est moins pénalisant pour les cellules cérébrales.