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?

Gabrial Johnas
sumber
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).

terdon
sumber
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 ( [^:]*).

Freddy
sumber
18

Pasti akan merekomendasikan awk:

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

Digunakan :sebagai pemisah bidang dan mencetak bidang pertama.

Centimane
sumber
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.

Randy Josleyn
sumber
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
schrodigerscatcuriosity
sumber
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
-1

Anda dapat mencapainya dengan penanganan string bash, dengan menghapus kecocokan terlama dari string secara langsung untuk setiap baris dengan seperti:

for line in $(cat inputfile); do echo "${line%%:*}"; done

Ini mungkin menjadi alternatif yang berguna jika Anda mem-parsing file dalam skrip shell (meskipun saya curiga menggunakan cut mungkin lebih efisien).

Jim Rippon
sumber