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?
text-processing
grep
Gabrial Johnas
sumber
sumber
grep
utilitas 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, seperticut
utilitas.grep
adalah alat yang tepat untuk menyelesaikan yang sebenarnya masalah.Jawaban:
Ini
cut
untuk:Anda hanya mengatur pembatas
:
dengan-d:
dan katakan hanya mencetak bidang 1 (-f1
).sumber
Atau alternatif:
Ini mengembalikan setiap karakter yang dimulai pada awal setiap baris (
^
) yang bukan titik dua ([^:]*
).sumber
Pasti akan merekomendasikan
awk
:Digunakan
:
sebagai pemisah bidang dan mencetak bidang pertama.sumber
jawaban yang diperbarui
Mempertimbangkan file berikut
file.txt
:Anda dapat menggunakan
sed
untuk menghapus semuanya setelah titik dua: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.
sumber
sed -e 's/:.*//' file.txt
adalah cara lain dengan sed Posix.sed -ne 'y/:/\n/;P' file.txt
juga bisa digunakan..+
to.*
if
dalams///p
sintaks, Anda perlu memodifikasi regex Anda untuk menjaga garis tanpa titik dua, sesuatu sepertised -nEe 's/([^:]*)(:.*|)/\1/p'
,. Catatan ini membutuhkanGNU sed
tetapi karena bagaimanapun Anda berada di GNU sed jadi ini seharusnya tidak masalah.sed -n '/:/s/^\([^:]*\):.*$/\1/p
(tambahkan--posix
jika Anda menggunakan GNU sed, hanya untukMaksud Anda seperti ini:
Keluaran:
sumber
echo foo:bar:baz | grep -oP '.*(?=:)'
. Ini akan berfungsi untuk contoh OP, tetapi tidak untuk kasus umum seperti yang dijelaskan dalam pertanyaan.Anda dapat mencapainya dengan penanganan string bash, dengan menghapus kecocokan terlama dari string secara langsung untuk setiap baris dengan seperti:
Ini mungkin menjadi alternatif yang berguna jika Anda mem-parsing file dalam skrip shell (meskipun saya curiga menggunakan cut mungkin lebih efisien).
sumber
Dalam shell POSIX murni tanpa menggunakan perintah eksternal, saya akan melakukan:
sumber