grep - menghapus teks setelah token pembatas


12

Saya memiliki file di mana saya harus menghilangkan semuanya setelah yang pertama ;pada setiap baris.

Jadi file seperti ini:

sdfsdsdf;
fsdfsddf;sdfsd;

Akan menghasilkan ini:

sdfsdsdf
fsdfsddf

Saya telah melihat ke dalam grepdan sed. Saya akan menghargai jawaban yang menggabungkan salah satu dari perintah ini.

Jawaban:


5

sed mungkin paling mudah dan lebih cepat daripada awk atau perl dalam keadaan ini:

sed 's/^\([^;][^;]*\);.*$/\1/' some_file_name

6
Ini lebih rumit dari yang seharusnya! sed 's/;.*//'
— Gilles 'SANGAT berhenti menjadi jahat'

Saya mohon untuk berbeda. perl -pe 's /;.*//' some_file_name sama mudahnya, dan bisa dibilang hingga 1500% lebih cepat saat beroperasi dalam file besar.
— codehead

Saya memiliki beberapa sistem di mana sed tersedia tetapi perl tidak, jadi saya mendorong menggunakan solusi yang lebih ringan di mana mereka mencukupi.
— dubiousjim

7

Pilihan lain adalah menggunakan cutperintah

cat a.file | cut -d';' -f1

9
tidak berguna kami dari kucing

3

Saya biasanya menggunakan awkuntuk hal-hal seperti ini:

cat a.file | awk -F=";" '{ print $1 }'

Itu akan mengambil setiap baris file dan mencetak grup pertama sebelum pembatas -F


7
penggunaan tidak berguna cat.
— Dijeda sampai pemberitahuan lebih lanjut.

1
Dennis kedua di sana. Dan di bawah linux dan BSD bahwa -F = ";" tidak berfungsi sebagaimana dimaksud. Dan Anda mungkin ingin mengutip $ 1 itu juga: awk -F ";" '{print $ 1}' a.file
— codehead

2

Berikut cara untuk melakukannya menggunakan GNU grep:

grep -Po "^[^;]+(?=;?)" filename

Tanpa Gnu grep: grep -Eo '^[^;]+;' filenamehampir mendapatkannya, ia hanya mencetak satu karakter terlalu banyak. grep -Eo '^[^;]+' filenamehampir mendapatkannya juga, tetapi itu juga akan mencetak garis lengkap (tidak kosong) yang tidak memilikinya ;.
— dubiousjim
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.