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.
Dengan asumsi apa yang Anda maksud sebenarnya adalah bahwa Anda ingin menghapus semuanya hingga titik dua terakhir dan membiarkannya john.doe
tetap utuh:
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
sed 's/.*://'
Baris pertama hanya memipihkan string uji ke sed
untuk tujuan contoh.
Yang kedua adalah sed
substitusi 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.
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'
Saya mengganti semua kemunculan : dengan tab dan kemudian gunakan awk
untuk 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 awk
untuk mencetak kolom terakhir sendiri menggunakan NF
variabel awk
seperti 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}'
awk
, mengapa tidak lakukanawk -F:
?awk
. Pada dasarnya, saya mencoba untuk menguji perintah yang saya dapatkan pada jawaban saya dan mencoba untuk memodifikasinya sesuai dengan kebutuhan pengguna. :)-F
pilihan untukawk
menentukan pemisah lapangan. Jika Anda memintaawk
untuk menggunakan titik dua, tidak perlu mengganti titik dua dengan tab. Juga, jika Anda ingin mendapatkan bidang terakhir yang dapat Anda gunakan,$NF
bukan$4
, ini akan berfungsi jika tidak selalu ada 3 titik dua.Metode lain menggunakan
awk
:sumber
Silakan dicoba
edit: jangkar dihapus
dan untuk menghapus
sumber
^
jangkar tidak membuat perbedaan dalam hal baik pertanyaan atau dalam kasus contoh Anda. Alamat apa pun yang dimulai dengan/.*
sudah menyiratkan^
.