Bagaimana cara menyalin rincian dari file secara selektif dan menempelnya ke file baru?

11

Saya memiliki file yang berisi detail pribadi saya (.txt). Bagaimana saya bisa melalui terminal hanya menyalin beberapa detail dari file dan memasukkannya ke .txtfile baru ?

Misalnya, jika ini adalah isi file:

name : farah age : 23 phone number : 0123 education : degree

bagaimana saya bisa menyalin hanya umur dan nomor telepon dan menampilkannya ke .txtfile baru ?

MsWanie
sumber
2
Tergantung pada apa yang ingin Anda salin ke file baru. Apakah Anda ingin beberapa baris pertama, beberapa baris terakhir, berisi string, tidak mengandung string, garis di antara dua string? Ada alat untuk melakukan semua ini, tetapi kami perlu tahu apa yang ingin Anda lakukan.
Arcege

Jawaban:

7

Ada beberapa cara untuk melakukan ini. Jika file Anda memiliki struktur yang diketahui, Anda dapat menggunakan grep. The grepperintah pencarian file untuk frase tertentu dan kembali baris yang cocok frase itu. Jadi jika file Anda terlihat seperti

Nama: Sally

Tanggal Lahir: 7.31.76

Alamat: 1234 Main St.

SSN: 123-45-6789

Anda dapat berlari grep Name info.txtdan itu akan kembali Name: Sally. Anda kemudian dapat mengarahkan output ke file lain. Memanggil begitu

grep Name info.txt > info2.txt

akan menampilkan baris ke info2.txt file baru. Jika Anda ingin menambahkan baris baru, Anda dapat melakukannya

grep Address info.txt >> info2.txt

jika tidak file akan ditimpa.

Anda juga bisa belajar menggunakan editor teks baris perintah seperti vim.

Kris Harper
sumber
2

Anda dapat menggunakan grep untuk mencari ekspresi reguler di details.txt dan mengarahkan hasilnya ke file baru.

Jika semua baris yang ingin Anda salin memiliki kesamaan, baris lainnya tidak dapat Anda gunakan:

grep "string in common" details.txt > new.txt

Jika tidak, Anda harus mencari setiap baris yang ingin Anda salin, masih menggunakan grep, dan menambahkannya ke new.txt menggunakan >>sebagai ganti >.

danjjl
sumber
1

Ada juga editor yang berfungsi di terminal, misalnya nano, vi dan emacs.

Jika Anda menggunakan antarmuka pengguna grafis pada mesin lokal Anda dan terminal pada mesin jarak jauh, Anda juga dapat menggunakan mouse untuk menyalin dan menempelkan dari satu jendela terminal / tab ke yang kedua.

elmicha
sumber
1

Mengasumsikan file input details.txtberisi:

name: farah
age: 23
phone number: 0123
education: degree

Anda dapat memilih baris "nama" dan "telepon" dengan grep yang diperluas dan mengarahkan ulang output ke new.txt:

grep -E "age:|phone number:" details.txt > new.txt

Ini akan menghasilkan new.txt dengan:

age: 23
phone number: 0123

Bagaimana itu bekerja:

Grep hanya mencetak garis yang cocok. The -Epilihan diaktifkan regexp diperpanjang yang memberi kemungkinan Anda untuk menggunakan |(alternatif). Ingatlah untuk mengutip seluruh pola, jadi |akan ditafsirkan dengan grep. Kalau tidak, shell akan mencoba menafsirkan. Anda tidak menginginkan ini di sini.

Michał Šrajer
sumber
1

File yang Anda perlihatkan memiliki semua detail pada satu baris:

name : farah age : 23 phone number : 0123 education : degree

Saya berasumsi bahwa Anda dapat meng-hard-code age :dll ke dalam perintah, tetapi teks yang mengikutinya akan bervariasi, dan detailnya mungkin tidak dalam urutan yang diberikan atau berdekatan.

Anda dapat mengekstrak bagian dari garis dengan grep's -obendera. Ini hanya mencetak bagian yang cocok, bukan seluruh baris.

Jika Anda ingin menyertakan bagian age :dan phone number :, Anda dapat menggunakan -ebendera untuk menentukan beberapa pertandingan, atau bergantian.

$ grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file
age : 23
phone number : 0123

Ekspresi [^ ]*berarti sejumlah karakter yang bukan spasi, sehingga cocok dengan karakter setelah age :hingga ruang berikutnya.

Ganti filedengan nama file yang berisi detail Anda. Anda dapat menulis file baru dengan mengarahkan output ke file baru dengan >operator, seperti ini:

grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file > outfile

Ketika Anda melakukan itu, Anda tidak akan melihat output apa pun. Anda harus memeriksa output terlebih dahulu, lalu tambahkan pengalihan.

Inilah contoh dengan pergantian. Kami menggunakan -Ebendera untuk memberi tahu grepuntuk menggunakan regex diperpanjang. Sintaksnya adalah (pattern1|pattern2)- ini cocok pattern1dan / atau pattern2. Jika salah satu ditemukan, itu akan dicetak (terlepas dari apakah yang lain ditemukan atau tidak). Saya sekarang menggunakan +makna setidaknya satu dari karakter sebelumnya, bukan *berarti nol atau lebih dari karakter sebelumnya. Dalam konteks ini, keduanya bekerja sama baiknya.

$ grep -Eo '(age : [^ ]+|phone number : [^ ]+)' file
age : 23 
phone number : 0123 

Jika Anda ingin menghilangkan bagian age :dan phone number:, Anda dapat menggunakan -Pbendera untuk meminta grepuntuk menggunakan ekspresi reguler yang kompatibel dengan Perl. Ini mendukung pergantian, dan juga cara mencocokkan teks setelah pola yang diberikan:

$ grep -Po '(age : \K[^ ]+|phone number : \K[^ ]+)' file
23
0123

Jika Anda ingin memformat teks secara berbeda, Anda dapat menggunakan sed, misalnya:

$ sed -r 's/.*(age) : ([^ ]*).*(phone number) : ([^ ]*).*/\1:\2 | \3:\4/' file
age:23 | phone number:0123

Ini tergantung pada agekedatangan sebelumnya phone number, jadi sesuaikanlah jika itu tidak terjadi. Jika Anda tidak dapat mengandalkan pesanan, Anda dapat menggunakan perintah yang sangat berbelit-belit ini:

$ sed -r 's/(.*)(phone number : [^ ]+)(.*) .*/\2 \1\4/; s/(phone number) : ([^ ]+) .*(age) : ([^ ]+).*/\1: \2 | \3: \4/' file
phone number: 0123 | age: 23

Ini mengatur ulang garis sehingga phone number :bagian yang lebih dulu pada setiap baris, kemudian melakukan penggantian kedua untuk memilih detail yang diinginkan. Saya berhutang teknik yang digunakan di sini untuk jawaban ini oleh muru .

Catatan tentang sedperintah tidak tercakup oleh penjelasan sebelumnya

  • -rgunakan extended regex untuk perintah yang lebih mudah dibaca (GNU sedmengerti -Edengan arti yang sama)
  • s/old/new/ganti olddengannew
  • (pattern)simpan patternuntuk referensi nanti, dengan \1atau \2dll (sesuai dengan urutan kiri-ke-kanan di mana kelompok tangkapan terjadi - perhatikan bahwa sedhanya akan menampung hingga 7 dari ini!).
  • .karakter apa pun, karena itu .*mewakili sejumlah karakter apa pun.
  • ; memisahkan perintah, seperti pada shell.
Zanna
sumber