Sed menghapus semua kecocokan pola awal dari garis

11

Saya memiliki baris berikut:

abababtestab

Saya mencoba mencari sedekspresi untuk menghapus semua kemunculan dari abawal baris sehingga garis yang diubah harus:

testab

Saya merasa ini harus sederhana, tetapi saya benar-benar tidak tahu apa-apa sed.

Sejauh ini yang saya miliki adalah:

sed 's/^ab//'

Tapi ini hanya menghilangkan kemunculan pertama ab.

Dan
sumber

Jawaban:

16
sed 's/^\(ab\)*//' <in >out

Anda harus mengelompokkannya.

echo ababababtestab |
sed 's/^\(ab\)*//'

testab

Beberapa tua seds mungkin tidak menangani itu sangat baik, meskipun. Meskipun duplikasi sub-ekspresi adalah fitur BRE yang ditentukan POSIX , beberapa seds tidak mendukungnya. Dalam beberapa dari mereka, meskipun ...

echo abababtestab |
sed 's/^\(ab\)\1*//'

... mungkin bekerja sebagai gantinya.

mikeserv
sumber
Persis apa yang saya cari terima kasih! (Saya akan menandai sebagai jawaban setelah memungkinkan saya)
Dan
Bahkan Edisi ke-7 seddari sekitar tahun 1979 mendukungnya. Itu harus menjadi imitasi rendah untuk tidak menangani pengelompokan.
Jonathan Leffler
@ JonathanLeffler - lihat POSIX Regular Expression Rationale , yang, sebagian, berdasarkan pernyataan saya. Mungkin asumsi, tapi ada paragraf di sana ... Pengembang standar menganggap perilaku historis umum, yang mendukung \n*, tetapi tidak \n\{min,max\}. \(...\)*, atau \(...\)\{min,max\}, sebagai hasil yang tidak disengaja dari implementasi tertentu, dan mereka mendukung duplikasi dan ekspresi interval berikut sub-ekspresi dan referensi-kembali.
mikeserv
@ JonathanLeffler: Ini juga tidak berfungsi dengan versi sed dari heirloom toolchests.
cuonglm
@cuonglm - \(ab\)\1*versi berfungsi dengan heirloom default sed, dan \(ab\)*versi bekerja dengan heirloom SuSv4 sed. Setidaknya, itu untuk build saya. Harus diakui, saya membangun pusaka yang dipasang pada musl lib C, dan dengan demikian saya bisa membayangkan hal itu dapat menyebabkannya berperilaku berbeda. Tapi biasanya ketika fitur yang ditentukan bekerja pada heirloom SuSv4 heirloom tool tetapi tidak di tool default, itu karena dev membuatnya.
mikeserv
6

Lainnya sed:

sed -e ':1' -e 's/^ab//;t1'

Dengan setiap baris input, kami membuat label :1, lalu melakukan spenggantian abdi awal baris. Jika substitusi berhasil, test cabang perintah untuk label 1, ulang pekerjaan sampai tidak ada abpola yang muncul di awal baris, kita selesai.

cuonglm
sumber
Pikiranku persis. Sebenarnya, Anda tidak perlu menguji: s/^ab//; t1sudah cukup
glenn jackman
@glennjackman: Ah, tentu saja. Diperbarui!
cuonglm