Dapatkan konten sebelum titik dua


8

Saya memiliki file teks di Linux yang isinya seperti di bawah ini:

help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com

Saya ingin mendapatkan konten sebelum titik dua seperti di bawah ini:

help.helloworld.com
dev.helloworld.com

Bagaimana saya bisa melakukan itu di dalam terminal?


2
The greputilitas digunakan untuk mencari jalur pencocokan ekspresi reguler. Anda mungkin dapat menggunakannya di sini, tetapi akan lebih tepat untuk menggunakan alat yang mengekstrak data dari bidang yang diberi pembatas tertentu, seperti cututilitas.
Kusalananda

Saya telah mengirimkan suntingan untuk mengeluarkan kata "grep" dan menggantinya dengan "temukan" di judul dan "dapatkan" di badan pertanyaan, untuk menghindari masalah X / Y dengan menganggap grepadalah alat yang tepat untuk menyelesaikan yang sebenarnya masalah.
Monty Harder

1
Yang bisa saya katakan adalah bahwa isi sebelum titik dua jauh lebih baik daripada isi setelah titik dua ;-).
Peter - Pasang kembali Monica

Jawaban:


35

Ini cutuntuk:

$ cat file
help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
foo:baz:bar
foo

$ cut -d: -f1 file
help.helloworld.com
dev.helloworld.com
foo
foo

Anda hanya mengatur pembatas :dengan -d:dan katakan hanya mencetak bidang 1 ( -f1).


19

Atau alternatif:

$ grep -o '^[^:]*' file
help.helloworld.com
dev.helloworld.com

Ini mengembalikan setiap karakter yang dimulai pada awal setiap baris ( ^) yang bukan titik dua ( [^:]*).


18

Pasti akan merekomendasikan awk:

awk -F ':' '{print $1}' file

Digunakan :sebagai pemisah bidang dan mencetak bidang pertama.


5

jawaban yang diperbarui

Mempertimbangkan file berikut file.txt:

help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
no.colon.com
colon.at.the.end.com:

Anda dapat menggunakan seduntuk menghapus semuanya setelah titik dua:

sed -e 's/:.*//' file.txt

Ini berfungsi untuk semua kasus sudut yang ditunjukkan dalam komentar-jika berakhir pada titik dua, atau jika tidak ada titik dua, meskipun ini tidak disebutkan dalam pertanyaan itu sendiri. Terima kasih kepada @Rakesh Sharma, @mirabilos, dan @Freddy untuk komentar mereka. Menjawab pertanyaan adalah cara yang bagus untuk belajar.


4
sed -e 's/:.*//' file.txtadalah cara lain dengan sed Posix.
Rakesh Sharma

1
sed -ne 'y/:/\n/;P' file.txtjuga bisa digunakan.
Rakesh Sharma

Make .+to.*
Rakesh Sharma

@Randy Joselyn Karena ada implisit ifdalam s///psintaks, Anda perlu memodifikasi regex Anda untuk menjaga garis tanpa titik dua, sesuatu seperti sed -nEe 's/([^:]*)(:.*|)/\1/p',. Catatan ini membutuhkan GNU sedtetapi karena bagaimanapun Anda berada di GNU sed jadi ini seharusnya tidak masalah.
Rakesh Sharma

Jawaban ini bisa jadi favorit saya, tetapi ERE tidak perlu. sed -n '/:/s/^\([^:]*\):.*$/\1/p(tambahkan --posixjika Anda menggunakan GNU sed, hanya untuk
mengabaikan

4

Membutuhkan GNU grep. Ini tidak akan berfungsi dengan grep default pada mis. MacOS atau BSD lainnya.

Maksud Anda seperti ini:

grep -oP '.*(?=:)' file

Keluaran:

help.helloworld.com
dev.helloworld.com

4
Jika ada dua atau lebih titik dua di telepon, ini akan mencetak semuanya sampai yang terakhir, jadi bukan yang dibutuhkan OP. Coba echo foo:bar:baz | grep -oP '.*(?=:)'. Ini akan berfungsi untuk contoh OP, tetapi tidak untuk kasus umum seperti yang dijelaskan dalam pertanyaan.
terdon

hanya ada satu titik dua dan berfungsi dengan baik, tetapi terima kasih atas pembaruannya
Gabrial Johnas


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.