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.