Bagaimana cara menggunakan Sed untuk mengganti semua karakter sebelum titik dua?

25

Bagaimana cara mengganti string berikut

hd_ma_prod_customer_ro:*:123456789:john.doe

dengan john.doe

Pada dasarnya saya perlu mencari titik dua terakhir (:) dan menghapus semuanya sebelum dan memasukkannya.

yihyoon
sumber

Jawaban:

40

Dengan asumsi apa yang Anda maksud sebenarnya adalah bahwa Anda ingin menghapus semuanya hingga titik dua terakhir dan membiarkannya john.doetetap utuh:

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
  sed 's/.*://'

Penjelasan:

Baris pertama hanya memipihkan string uji ke seduntuk tujuan contoh.

Yang kedua adalah sedsubstitusi dasar . Bagian antara yang pertama dan yang kedua /adalah regex untuk dicari dan bagian antara yang kedua dan ketiga adalah apa yang harus diganti (tidak ada dalam hal ini seperti yang kita hapus).

Untuk regex, .cocok dengan karakter apa pun, *ulangi ini beberapa kali (termasuk nol) dan :cocok dengan tanda titik dua. Jadi secara efektif itu adalah apa pun yang diikuti oleh titik dua. Karena .*dapat menyertakan titik dua, pertandingan 'serakah' dan semuanya hingga titik dua terakhir termasuk.

Graeme
sumber
7
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'

Saya mengganti semua kemunculan : dengan tab dan kemudian gunakan awkuntuk mengekstrak string john.doe.

Jika Anda tidak memiliki file, Anda dapat mencoba ini.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | 
awk -F'\t' '{print $4}'

Sesuai komentar Graeme, kita dapat menggunakan awkuntuk mencetak kolom terakhir sendiri menggunakan NFvariabel awkseperti di bawah ini.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'

Menggabungkan komentar Graeme untuk menghilangkan yang tidak perlu sed

Perintah dapat dimodifikasi seperti di bawah ini.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'
Ramesh
sumber
1
Jika Anda akan menggunakan awk, mengapa tidak lakukan awk -F:?
Graeme
@ Greme, aku masih tidak nyaman dengan itu awk. Pada dasarnya, saya mencoba untuk menguji perintah yang saya dapatkan pada jawaban saya dan mencoba untuk memodifikasinya sesuai dengan kebutuhan pengguna. :)
Ramesh
3
The -Fpilihan untuk awkmenentukan pemisah lapangan. Jika Anda meminta awkuntuk menggunakan titik dua, tidak perlu mengganti titik dua dengan tab. Juga, jika Anda ingin mendapatkan bidang terakhir yang dapat Anda gunakan, $NFbukan $4, ini akan berfungsi jika tidak selalu ada 3 titik dua.
Graeme
@Graeme, saya telah memasukkan perubahan yang telah Anda sebutkan. Tolong beri tahu saya jika ini baik-baik saja :)
Ramesh
Ya, bekerja dengan sempurna!
Graeme
6

Metode lain menggunakan awk:

awk -F: '{ print $NF }'
Chris Down
sumber
2

Silakan dicoba

edit: jangkar dihapus

echo 'abc:fjk' |sed 's/.*:/john.doe/g'

dan untuk menghapus

echo 'abc:fjk' |sed 's/.*://g'
akash
sumber
bukan itu yang diminta OP
iruvar
harap baca kembali pertanyaannya lagi.
akash
Yah Anda menyelinap di hapus setelah komentar saya, sudahlah
iruvar
Oh begitu . permintaan maaf saya 1_CR
akash
1
The ^jangkar tidak membuat perbedaan dalam hal baik pertanyaan atau dalam kasus contoh Anda. Alamat apa pun yang dimulai dengan /.*sudah menyiratkan ^.
mikeserv