Sed, tüm başlangıç ​​deseni eşleşmelerini satırdan kaldır


11

Aşağıdaki satır var:

abababtestab

Dönüştürülen çizgi olmalıdır böylece satırın başından sedtüm oluşumları kaldırmak için bir ifade anlamaya çalışıyorum ab:

testab

Bunun basit olması gerektiğini hissediyorum, ama gerçekten hiçbir şey bilmiyorum sed.

Şimdiye kadar sahip olduğum şey:

sed 's/^ab//'

Ancak bu sadece ab'nin ilk oluşumunu ortadan kaldırır.

Yanıtlar:


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

Gruplandırmalısınız.

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

testab

Bazı eski sedler olsa çok iyi idare olmayabilir. Alt ifade çoğaltma BRE'nin POSIX tarafından belirtilen bir özelliği olmasına rağmen , bazıları sedbunu düzgün bir şekilde desteklemez. Ancak bazılarında ...

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

... bunun yerine işe yarayabilir.


Tam olarak ne aradığımı teşekkürler! (Bana izin verdiğinde cevap olarak işaretleyeceğim)
Dan

sed1979'dan itibaren 7. Baskı bile bunu destekledi. Gruplandırmayı ele almamak daha düşük bir taklit olmalıdır.
Jonathan Leffler

@JonathanLeffler - kısmen, ifadeye dayandığım POSIX Düzenli İfade Gerekçesine bakın . Belki bir varsayım, ama orada bir paragraf var ... Standart geliştiriciler, destekleyen \n*ancak desteklemeyen ortak tarihsel davranışı dikkate aldılar \n\{min,max\}. \(...\)*veya \(...\)\{min,max\}belirli bir uygulamanın kasıtlı olmayan bir sonucu olarak ve bunlar alt ifadeleri ve geri referansları takiben hem yineleme hem de aralık ifadelerini destekledi.
mikeserv

@JonathanLeffler: Heirloom toolchest'lerinden sed sürümü ile de çalışmaz.
cuonglm

@cuonglm - \(ab\)\1*sürüm varsayılan yadigârla çalışır sedve \(ab\)*sürüm SuSv4 yadigarıyla çalışır sed. En azından benim yapım için yapıyor. Kuşkusuz, yadigâr setimi musl lib C'ye karşı inşa ettim ve böylece bunun farklı davranmasına neden olabileceğini hayal edebiliyorum. Ancak genellikle belirli bir özellik bir yadigar SuSv4 yadigar aracında çalıştığında, ancak varsayılan araçta çalışmadığında, bunun nedeni geliştiricinin bunu yapmasıdır.
mikeserv

6

Başka bir sed:

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

Her girdi satırında bir etiket oluşturduk :1, ardından satırın başında sikame abgerçekleştirdik. Eğer substitution başarıyla tetikete est komut şube 1, hiçbir dek işi yeniden absatırın başında göründü desen, bitti.


Benim düşüncelerim tam. Kesinlikle, test etmenize gerek yok: s/^ab//; t1yeterli
glenn jackman

@glennjackman: Ah, elbette. Güncelleme!
cuonglm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.