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.