Sed rimuove tutte le corrispondenze del motivo iniziale dalla linea


11

Ho la seguente riga:

abababtestab

Sto cercando di capire sedun'espressione per rimuovere tutte le occorrenze abdall'inizio della linea, quindi la linea trasformata dovrebbe essere:

testab

Sento che questo dovrebbe essere semplice, ma davvero non ne so nulla sed.

Quello che ho finora è:

sed 's/^ab//'

Ma questo rimuove solo la prima occorrenza di ab.

Risposte:


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

Dovresti raggrupparlo.

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

testab

Alcuni anziani seds non possono gestire molto bene, però. Sebbene la duplicazione di sottoespressioni sia una funzione di BRE specificata da POSIX , alcuni sednon la supportano correttamente. In alcuni di questi, però ...

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

... potrebbe invece funzionare.


Esattamente quello che stavo cercando, grazie! (Contrassegnerò come risposta una volta che mi permette)
Dan

Anche la 7a edizione seddel 1979 circa l'ha supportata. Dovrebbe essere un'imitazione inferiore non gestire il raggruppamento.
Jonathan Leffler,

@JonathanLeffler - vedere la logica dell'espressione regolare POSIX , che è, in parte, su cui ho basato l'affermazione. Forse è un presupposto, ma c'è un paragrafo lì ... Gli sviluppatori standard hanno considerato il comportamento storico comune, che ha supportato \n*, ma non \n\{min,max\}. \(...\)*o \(...\)\{min,max\}, come risultato non intenzionale di un'implementazione specifica, e hanno supportato espressioni di duplicazione e intervallo a seguito di sottoespressioni e riferimenti secondari.
Mikeserv,

@JonathanLeffler: Inoltre non funziona con la versione sed dei toolchest di cimelio.
cuonglm,

@cuonglm: la \(ab\)\1*versione funziona con il cimelio di default sede la \(ab\)*versione funziona con il cimelio di SuSv4 sed. Almeno, lo fa per la mia build. Devo ammettere che ho costruito il mio set di cimelio contro la musl lib C, e quindi posso immaginare che ciò potrebbe causare un comportamento diverso. Ma di solito quando una funzione specifica funziona in uno strumento cimelio SuSv4 cimelio ma non nello strumento predefinito, è perché lo sviluppatore l'ha fatto fare.
Mikeserv,

6

Un altro sed:

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

Con ogni riga di input, impostiamo un'etichetta :1, quindi facciamo substitution aball'inizio della riga. Se substitution ha esito positivo, test comando il ramo per etichettare 1, ripetere il lavoro fino a quando non abappare alcun motivo all'inizio della riga, abbiamo finito.


I miei pensieri esattamente. Rigorosamente, non è necessario testare: s/^ab//; t1è sufficiente
Glenn Jackman,

@glennjackman: Ah, certo. Aggiornato!
cuonglm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.