Bagaimana cara mencocokkan angka yang diikuti oleh titik menggunakan sed?

76

Saya mencoba menggunakan seduntuk mengganti semua pola dengan digit diikuti segera oleh titik (seperti 3., 355.) dengan string kosong. Jadi saya coba:

sed 's/\d+\.//g' file.txt

Tapi itu tidak berhasil. Mengapa demikian?

Mika H.
sumber
1
Saya menemukan artikel ini sangat berguna
Stphane

Jawaban:

111

Karena sed bukan perl - regex sed tidak memiliki tulisan cepat \d:

sed 's/[[:digit:]]\+\.//g'

sed dokumentasi ekspresi reguler di sini .

glenn jackman
sumber
3
Itu jika Anda ingin nol atau lebih digit. /[[:digit:]]*\. /akan cocok dengan string foo.karena Anda mengizinkan nol digit. Jika Anda ingin satu atau lebih penggunaan \+seperti yang ditunjukkan
glenn jackman
71

Dua masalah:

  1. sedtidak mendukung \d. Gunakan [0-9]atau [[:digit:]].

  2. +harus backslashed untuk mendapatkan arti khusus: \+.

choroba
sumber
6
alih-alih melakukan backslashing tanda + (yang tidak berfungsi pada Mac OS X, misalnya) Anda dapat menggunakan opsi -E untuk interpret regular expressions as extended (modern) regular expressions rather than basic regular expressions (BRE's).Sedihnya, ini tidak membantu dengan masalah \ d ...
gMale
4
@gmale: -Etidak berfungsi untuk GNU sed, ia digunakan -rsebagai gantinya.
choroba
12
Oke ... itu benar-benar terlihat seperti sedmenyebalkan ketika datang ke portabilitas ...
iconoclast
@ choroba saya pikir saya bingung sendiri hari ini. Saya akan menghapus komentar berisik saya ...
Steven Lu
Pada dasarnya, yang saya coba peringatkan adalah: Jika Anda tidak menggunakan extended regex ( -Epada BSD sed dan -rpada GNU sed), di BSD sed, tidak +juga \+(sama dengan ?) akan bekerja sama sekali, sedangkan di sed GNU Anda bisa buat mereka untuk bekerja dengan backslash. Oleh karena itu rekomendasi umum untuk menggunakan regex diperpanjang dalam skrip
Steven Lu
3

Halaman manual sed merujuk ke halaman manual re_format. Itu membuat 2 perbedaan: (1) usang dan ekspresi reguler yang diperluas; (2) ekspresi reguler tidak ditingkatkan versus ditingkatkan. Semua 4 kombinasi dimungkinkan. Ada dukungan sed untuk kedua usang dan diperpanjang, tetapi dalam kedua kasus hanya untuk non-ditingkatkan. Operator adalah fitur ekspresi reguler yang disempurnakan, oleh karena itu tidak didukung oleh sed.

Jonathan Pool
sumber