Tre diversi sed
comandi:
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é sed
tendono 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 N
comando ext per aggiungere la riga di input successiva allo spazio del pattern seguendo un \n
carattere di ewline. Chiunque abbia lavorato sed
per un po 'di tempo avrà imparato a fare affidamento sul \n
personaggio 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 - sed
agisce 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;D
ciclo molto semplice . Questi tre comandi sono integrati in qualsiasi POSIX compatibile sed
e si completano perfettamente.
N
- come già accennato, accoda la N
linea di input ext allo spazio-pattern seguendo un \n
delimitatore ewline inserito .
P
- come p
; esso P
rints pattern-space - ma solo fino a che si verifica il primo \n
carattere ewline. E così, dato il seguente input / comando:
printf %s\\n one two | sed '$!N;P;d'
sed
P
ne strappa solo uno . Tuttavia, con ...
D
- come d
; D
elimina lo spazio-modello e inizia un altro ciclo di linea. Diversamente d
, D
elimina solo fino alla prima \n
ewline che si verifica nello spazio modello. Se c'è più spazio nel pattern dopo il \n
carattere di ewline, sed
inizia il ciclo di riga successivo con ciò che rimane. Se l' d
nell'esempio precedente sono stati sostituiti con D
, per esempio, sed
sarebbe P
Rint sia uno e due .
Questo comando ricorre solo per le righe che non corrispondono s///
all'istruzione ubstitution. Poiché s///
ubstitution rimuove la \n
ewline aggiunta con N
, non c'è mai nulla che rimanga quando sed
D
elimina lo spazio-modello.
Si potrebbero fare dei test per applicare il P
e / o D
selettivamente, 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 :b
ranch / t
est (come è dimostrato anche nella risposta di Joeseph R. qui ) e lo ricontattano a determinate condizioni.
-e :n -e
- gli sed
script portatili delimiteranno una :
definizione di etichetta con una \n
ewline o una nuova -e
istruzione xecution inline .
:n
- definisce un'etichetta denominata n
. Questo può essere restituito in qualsiasi momento con bn
o tn
.
tn
- il t
comando 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 t
con successo.
In questo comando si verifica la ricorsione per le righe corrispondenti. Se sed
sostituisce correttamente il motivo con altri caratteri , sed
torna :n
all'etichetta e riprova. Se un s///
ubstitution non viene eseguito, stampa automaticamente lo sed
spazio-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 sed
test. Poiché il b
comando ranch è una funzione di questo indirizzo, sed
tornerà a b
ranch :n
dopo che \n
è stata aggiunta una ewline e lo spazio del modello termina ancora con una "
virgoletta doppia.
C'è poco da fare tra N
e il b
più possibile - in questo modo è sed
possibile 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 g
bandiera lobal - e quindi farà tutte le sostituzioni necessarie in una sola volta. Dato un input identico, questo comando restituisce identico all'ultimo.
\n
dichiarazione 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 altrised
rifiuterà quella fuga sul lato destro. tuttavia, la\n
fuga funzionerà a sinistra in qualsiasi POSIXsed
e puoi tradurli in modo portabile comey/c/\n/
se avesse lo stesso effettos/c/\n/g
e quindi non è sempre così utile.