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 tahucut
untuk menggunakan.
sebagai pembatas.-f2-
memberi tahucut
untuk 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 (\2
dalam pola substitusi) - Domain setidaknya harus domain .com level 3 (setiap
\+
pengulangan berarti setidaknya satu kecocokan) - Penelusuran tidak peka huruf besar/kecil (
i
bendera pada akhirnya) - Hal ini dapat melakukan lebih dari pencocokan per baris (
g
bendera 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.