Menggunakan sed
:
sed 's/^[^"]*"\([^"]*\)".*/\1/'
Yang terlihat untuk: awal baris, serangkaian non-kutipan, kutipan ganda, menangkap serangkaian tanda kutip, kutipan ganda dan apa pun di baris, dan menggantinya dengan materi yang ditangkap.
$ 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
$
Uji pada RHEL 5 Linux dengan GNU sed
, tetapi hanya menggunakan fitur yang akan bekerja dalam versi 7 UNIX ™ sed
.
Kebetulan, cara yang sedikit lebih sederhana untuk melakukannya adalah dengan dua perintah pengganti; ubah semuanya hingga dan termasuk kutipan ganda pertama menjadi string kosong (itu adalah urutan nol atau lebih non kutipan diikuti oleh kutipan ganda); ubah semuanya setelah apa yang sekarang menjadi kutipan ganda pertama menjadi nol:
sed 's/^[^"]*"//; s/".*//'
Secara kebetulan, perintah yang Anda coba (`sed -n '/" /, / "/ p') mencetak dari satu baris yang berisi penawaran ganda ke baris berikutnya yang berisi penawaran ganda, tanpa mengedit baris sama sekali. Itulah mengapa itu tampaknya tidak berhasil untuk Anda - itu melakukan apa yang Anda minta, tetapi apa yang Anda minta untuk lakukan bukanlah apa yang ingin Anda lakukan.
Dari sisi efisiensi, tidak mungkin ada perbedaan yang terukur dalam kinerja. Dalam hal kemudahan perawatan, saya kira yang terakhir kurang membebani sel-sel otak.