Tre diversi sedcomandi:
sed '$!N;s/"[^"]*"\n<[^>]*>/other characters /;P;D'
sed -e :n -e '$!N;s/"[^"]*"\n<[^>]*>/other characters /;tn'
sed -e :n -e '$!N;/"$/{$!bn' -e '};s/"[^"]*"\n<[^>]*>/other characters /g'
Tutti e tre si basano sul s///comando ubstitution di base :
s/"[^"]*"\n<[^>]*>/other characters /
Tentano anche tutti di occuparsi della gestione dell'ultima riga, poiché sedtendono a differire in termini di output nei casi limite. Questo è il significato di $!quale indirizzo corrisponde a ogni riga che !non è l' $ultima.
Usano anche tutti il Ncomando ext per aggiungere la riga di input successiva allo spazio del pattern seguendo un \ncarattere di ewline. Chiunque abbia lavorato sedper un po 'di tempo avrà imparato a fare affidamento sul \npersonaggio della ewline - perché l'unico modo per ottenerlo è metterlo esplicitamente lì.
Tutti e tre fanno un tentativo per leggere il minor input possibile prima di agire - sedagisce appena possibile e non è necessario leggere in un intero file di input prima di farlo.
Sebbene facciano tutti N, tutti e tre differiscono nei loro metodi di ricorsione.
Primo comando
Il primo comando utilizza un N;P;Dciclo molto semplice . Questi tre comandi sono integrati in qualsiasi POSIX compatibile sede si completano perfettamente.
N- come già accennato, accoda la Nlinea di input ext allo spazio-pattern seguendo un \ndelimitatore ewline inserito .
P- come p; esso Prints pattern-space - ma solo fino a che si verifica il primo \ncarattere ewline. E così, dato il seguente input / comando:
printf %s\\n one two | sed '$!N;P;d'
sed Pne strappa solo uno . Tuttavia, con ...
D- come d; Delimina lo spazio-modello e inizia un altro ciclo di linea. Diversamente d , Delimina solo fino alla prima \newline che si verifica nello spazio modello. Se c'è più spazio nel pattern dopo il \ncarattere di ewline, sedinizia il ciclo di riga successivo con ciò che rimane. Se l' dnell'esempio precedente sono stati sostituiti con D, per esempio, sedsarebbe PRint sia uno e due .
Questo comando ricorre solo per le righe che non corrispondono s///all'istruzione ubstitution. Poiché s///ubstitution rimuove la \newline aggiunta con N, non c'è mai nulla che rimanga quando sed Delimina lo spazio-modello.
Si potrebbero fare dei test per applicare il Pe / o Dselettivamente, ma ci sono altri comandi che si adattano meglio a quella strategia. Poiché il ricorsione è implementata per gestire linee consecutive che hanno solo una parte della regola di sostituzione, sequenze consecutive di linee corrispondenza a entrambe le estremità della s///ubstitution non funzionano bene .:
Dato questo input:
first "line"
<second>"line"
<second>"line"
<second>line and so on
... stampa ...
first other characters "line"
<second>other characters line and so on
Tuttavia, gestisce
first "line"
second "line"
<second>line
...va bene.
Secondo comando
Questo comando è molto simile al terzo. Entrambi impiegano un'etichetta :branch / test (come è dimostrato anche nella risposta di Joeseph R. qui ) e lo ricontattano a determinate condizioni.
-e :n -e- gli sedscript portatili delimiteranno una :definizione di etichetta con una \newline o una nuova -eistruzione xecution inline .
:n- definisce un'etichetta denominata n. Questo può essere restituito in qualsiasi momento con bno tn.
tn- il tcomando est ritorna a un'etichetta specificata (o, se non ne viene fornita nessuna, chiude lo script per il ciclo di riga corrente) se si verifica un s///ubstitution dal momento che l'etichetta è stata definita o dall'ultima volta in cui l' est è stato chiamato tcon successo.
In questo comando si verifica la ricorsione per le righe corrispondenti. Se sedsostituisce correttamente il motivo con altri caratteri , sedtorna :nall'etichetta e riprova. Se un s///ubstitution non viene eseguito, stampa automaticamente lo sedspazio-motivo e inizia il ciclo di linea successivo.
Questo tende a gestire meglio le sequenze consecutive. Dove l'ultimo fallito, questo stampa:
first other characters other characters other characters line and so on
Terzo comando
Come accennato, la logica qui è molto simile alla precedente, ma il test è più esplicito.
/"$/bn- questo è un sedtest. Poiché il bcomando ranch è una funzione di questo indirizzo, sedtornerà a branch :ndopo che \nè stata aggiunta una ewline e lo spazio del modello termina ancora con una "virgoletta doppia.
C'è poco da fare tra Ne il bpiù possibile - in questo modo è sedpossibile raccogliere molto rapidamente esattamente tutti gli input necessari per garantire che la seguente riga non corrisponda alla regola. L' s///ubstitution differisce qui in quanto impiega la gbandiera lobal - e quindi farà tutte le sostituzioni necessarie in una sola volta. Dato un input identico, questo comando restituisce identico all'ultimo.
\ndichiarazione ewline che fai è il motivo per cui chiedo. le persone raramente chiedono se possono fare ciòs//\n/che è possibile con GNUsed, anche se la maggior parte degli altrisedrifiuterà quella fuga sul lato destro. tuttavia, la\nfuga funzionerà a sinistra in qualsiasi POSIXsede puoi tradurli in modo portabile comey/c/\n/se avesse lo stesso effettos/c/\n/ge quindi non è sempre così utile.