Saya punya file
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)
Sekarang saya ingin mengekstrak path file saja dan menyimpannya ke file lain. File output seperti:
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
Menggunakan sed atau awk bagaimana saya bisa melakukan ini?
Saya sudah mencoba sed -n '/"/,/"/p' myfile
tetapi tidak berfungsi.
Jawaban:
Anda dapat mem-pipe stderr dari perintah rsync Anda ke skrip awk:
Atau ke perintah cut seperti ini:
sumber
cut -d\" -f2
"
dan"
pada stderr.$1
; segala sesuatu antara tanda kutip ganda pertama dan kedua adalah$2
; dan semuanya setelah kutipan ganda kedua ada di$3
($4
, ...). Nama file (tampaknya) selalu berada di antara dua tanda kutip ganda pertama, jadi solusi ini harus berfungsi (dan lakukan ketika saya mengujinya).Menggunakan
sed
: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.
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:
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.
sumber
Jika versi Anda
grep
mendukung Perl-regexp:Hasil:
Anda juga bisa membuat ini tidak terlalu ketat, untuk mencocokkan apa pun di antara ganda jika Anda menginginkan:
sumber
.*
tidak rakus dengan.*?
berjaga-jaga kalau-kalau ada kutipan ganda tambahan di baris berikutnya? Atau gunakan[^"]*
di tempat.*
?Gunakan operator >> untuk menyimpan output apa pun ke file.
Suka
Jadi ubah saja untuk skenario spesifik Anda menggunakan sed dengan menambahkan
ke perintah
sumber
grep -r
melakukan pencarian rekursif melalui direktori yang tercantum dalam argumen (*
). Tidak jelas pola apa yang ada dalam pikiran Anda, tetapigrep
akan mengambil seluruh garis. Tujuan latihan ini adalah untuk mengumpulkan informasi dari bagian garis. Jika Anda menggunakan GNUgrep
, ada beberapa cara untuk melakukannya (-o
); ini adalah non-standar (kecuali sejauh GNU mendefinisikan standar de facto). Demikian pula dengan penggunaan ekspresi reguler PCRE; itu adalah ekstensi GNU lain. Mereka baik-baik saja jika Anda memiliki GNUgrep
dan tidak ada rencana untuk bekerja pada platform di mana GNUgrep
tidak tersedia secara default.