Usando sed
:
sed 's/^[^"]*"\([^"]*\)".*/\1/'
Isso procura: início da linha, uma série de não-aspas, aspas duplas, captura uma série de não-aspas, aspas duplas e qualquer outra coisa na linha e a substitui pelo material capturado.
$ 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
$
Teste no RHEL 5 Linux com GNU sed
, mas apenas usando recursos que funcionariam na versão UNIX ™ da 7ª Edição sed
.
Aliás, uma maneira um pouco mais simples de fazer isso é com dois comandos substitutos; altere tudo até e incluindo a primeira aspas duplas para uma sequência vazia (que é uma sequência de zero ou mais sem aspas seguidas por aspas duplas); mude tudo depois do que agora é a primeira citação dupla para nada:
sed 's/^[^"]*"//; s/".*//'
Aliás, o comando que você tentou (`sed -n '/" /, / "/ p') imprime de uma linha contendo aspas duplas para a próxima linha que contém aspas duplas, sem editar as linhas. Foi por isso que não pareceu funcionar para você - fez o que você pediu, mas o que você pediu para fazer não foi o que você pretendia pedir.
Em termos de eficiência, é improvável que haja uma diferença mensurável no desempenho. Em termos de facilidade de manutenção, suspeito que este último seja menos exigente para as células cerebrais.