Saya memiliki file yang berisi detail pribadi saya (.txt). Bagaimana saya bisa melalui terminal hanya menyalin beberapa detail dari file dan memasukkannya ke .txt
file 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 .txt
file baru ?
command-line
text-processing
MsWanie
sumber
sumber
Jawaban:
Ada beberapa cara untuk melakukan ini. Jika file Anda memiliki struktur yang diketahui, Anda dapat menggunakan
grep
. Thegrep
perintah pencarian file untuk frase tertentu dan kembali baris yang cocok frase itu. Jadi jika file Anda terlihat sepertiAnda dapat berlari
grep Name info.txt
dan itu akan kembaliName: Sally
. Anda kemudian dapat mengarahkan output ke file lain. Memanggil begitugrep 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.
sumber
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:
Jika tidak, Anda harus mencari setiap baris yang ingin Anda salin, masih menggunakan grep, dan menambahkannya ke new.txt menggunakan
>>
sebagai ganti>
.sumber
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.
sumber
Mengasumsikan file input
details.txt
berisi:Anda dapat memilih baris "nama" dan "telepon" dengan grep yang diperluas dan mengarahkan ulang output ke new.txt:
Ini akan menghasilkan new.txt dengan:
Bagaimana itu bekerja:
Grep hanya mencetak garis yang cocok. The
-E
pilihan 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.sumber
File yang Anda perlihatkan memiliki semua detail pada satu baris:
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-o
bendera. Ini hanya mencetak bagian yang cocok, bukan seluruh baris.Jika Anda ingin menyertakan bagian
age :
danphone number :
, Anda dapat menggunakan-e
bendera untuk menentukan beberapa pertandingan, atau bergantian.Ekspresi
[^ ]*
berarti sejumlah karakter yang bukan spasi, sehingga cocok dengan karakter setelahage :
hingga ruang berikutnya.Ganti
file
dengan nama file yang berisi detail Anda. Anda dapat menulis file baru dengan mengarahkan output ke file baru dengan>
operator, seperti ini: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
-E
bendera untuk memberi tahugrep
untuk menggunakan regex diperpanjang. Sintaksnya adalah(pattern1|pattern2)
- ini cocokpattern1
dan / ataupattern2
. 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.Jika Anda ingin menghilangkan bagian
age :
danphone number:
, Anda dapat menggunakan-P
bendera untuk memintagrep
untuk menggunakan ekspresi reguler yang kompatibel dengan Perl. Ini mendukung pergantian, dan juga cara mencocokkan teks setelah pola yang diberikan:Jika Anda ingin memformat teks secara berbeda, Anda dapat menggunakan
sed
, misalnya:Ini tergantung pada
age
kedatangan sebelumnyaphone number
, jadi sesuaikanlah jika itu tidak terjadi. Jika Anda tidak dapat mengandalkan pesanan, Anda dapat menggunakan perintah yang sangat berbelit-belit ini: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
sed
perintah tidak tercakup oleh penjelasan sebelumnya-r
gunakan extended regex untuk perintah yang lebih mudah dibaca (GNUsed
mengerti-E
dengan arti yang sama)s/old/new/
gantiold
dengannew
(pattern)
simpanpattern
untuk referensi nanti, dengan\1
atau\2
dll (sesuai dengan urutan kiri-ke-kanan di mana kelompok tangkapan terjadi - perhatikan bahwased
hanya akan menampung hingga 7 dari ini!)..
karakter apa pun, karena itu.*
mewakili sejumlah karakter apa pun.;
memisahkan perintah, seperti pada shell.sumber