Seperti yang telah dicatat oleh orang lain, grep tidak cocok untuk tugas ini, sed adalah pilihan yang baik, atau jika teks tertata dengan baik, gunakan cut sederhana mungkin lebih mudah untuk mengetik:
echo www.abc.com | cut -d. -f2-
-d.memberi tahucutuntuk menggunakan.sebagai pembatas.-f2-memberi tahucutuntuk mengembalikan bidang 2 hingga tak terbatas.
dengan --only-matching grep dan \K
Anda dapat melakukan ini dengan --only-matching grep bendera:
echo "www.abc.com" | grep --perl-regexp --only-matching 'www.\K.*'
yang dapat disingkat menjadi
echo "www.abc.com" | grep -Po 'www.\K.*'
Kedua perintah tersebut menghasilkan
abc.com
dengan grep (GNU grep) 3.3.
Alih-alih echo , saya akan menggunakan string di sini untuk mempersingkat perintah lebih lanjut:
grep -Po 'www.\K.*' <<< "www.abc.com"
\K mengatur ulang titik awal pertandingan, pada dasarnya melupakan "www." yang cocok. Lihat ini untuk informasi lebih lanjut tentang \K .
dengan tampilan positif grep
Anda juga dapat melakukannya dengan pandangan positif:
grep -Po '(?<=www.).*' <<< "www.abc.com"
dengan pemisah kolom awk -F
awk -F 'www.' <<< "www.abc.com" '$2{print $2}'
Ini mencetak
abc.com
$2{print $2} part akan mencetak bidang kedua jika ditentukan. Hal ini diperlukan dalam kasus masukan multi-baris untuk menghindari keluaran baris kosong untuk baris masukan yang tidak berisi pemisah bidang.
Anda tidak mengedit string dengan grep di shell Unix, grep biasanya digunakan untuk mencari atau menghapus beberapa baris dari teks. Anda lebih suka menggunakan sed sebagai gantinya:
$ echo www.example.com | sed 's/^[^\.]\+\.//'
example.com
Anda harus mempelajari ekspresi reguler untuk menggunakannya secara efektif.
Sed juga dapat mengedit file di tempat (memodifikasi file), jika Anda meneruskan -i argumen, tapi hati-hati, Anda dapat dengan mudah kehilangan data jika Anda salah menulis sed perintah dan gunakan -i bendera.
Contoh
Dari komentar Anda, tebak Anda memiliki dokumen TeX, dan Anda ingin menghapus bagian pertama dari semua nama domain .com. Jika itu adalah dokumen Anda test.tex :
\documentclass{article}
\begin{document}
www.example.com
example.com www.another.domain.com
\end{document}
maka Anda dapat mengubahnya dengan sed ini perintah (redirect output ke file atau edit di tempat dengan -i ):
$ sed 's/\([a-z0-9-]\+\.\)\(\([a-z0-9-]\+\.\)\+com\)/\2/gi' test.tex
\documentclass{article}
\begin{document}
example.com
example.com another.domain.com
\end{document}
Harap diperhatikan bahwa:
- Urutan umum dari simbol yang diperbolehkan diikuti dengan titik dicocokkan dengan
[a-z0-9-]\+\. - Saya menggunakan grup dalam ekspresi reguler (sebagian di dalam
\(dan\)) untuk menunjukkan bagian pertama dan kedua dari URL, dan saya mengganti seluruh kecocokan dengan grup kedua (\2dalam pola substitusi) - Domain setidaknya harus domain .com level 3 (setiap
\+pengulangan berarti setidaknya satu kecocokan) - Penelusuran tidak peka huruf besar/kecil (
ibendera pada akhirnya) - Hal ini dapat melakukan lebih dari pencocokan per baris (
gbendera pada akhirnya)
Anda dapat melakukannya menggunakan grep dengan mudah:
$ echo www.google.com | grep -o '[^.]*\.com'
google.com
Alih-alih echo Anda harus memberikan file Anda.
$ grep -o '[^.]*\.com$' < file
Di sini saya menggunakan ekspresi reguler '[^.]*.com'. Artinya:temukan saya kata tanpa . di dalamnya ([^.]* ), lalu lanjutkan .com (\.com di kembali). -o kunci mengatakan bahwa grep harus menunjukkan hanya bagian yang ditemukan.