Tutto sommato , divorare l'intero file potrebbe essere il modo più veloce per andare.
La sintassi di base è la seguente:
sed -e '1h;2,$H;$!d;g' -e 's/__YOUR_REGEX_GOES_HERE__...'
Intendiamoci, divorare l'intero file potrebbe non essere un'opzione se il file è tremendamente grande. In questi casi, altre risposte fornite qui offrono soluzioni personalizzate che garantiscono il funzionamento con un ingombro di memoria ridotto.
Per tutte le altre situazioni di hacking e slash, basta semplicemente anteporre -e '1h;2,$H;$!d;g'
seguito sed
all'argomento regex originale praticamente per fare il lavoro.
per esempio
$ echo -e "Dog\nFox\nCat\nSnake\n" | sed -e '1h;2,$H;$!d;g' -re 's/([^\n]*)\n([^\n]*)\n/Quick \2\nLazy \1\n/g'
Quick Fox
Lazy Dog
Quick Snake
Lazy Cat
Cosa fa -e '1h;2,$H;$!d;g'
?
La 1
, 2,$
, $!
le parti sono linea specifiche dell'avvio quel limite che riveste la seguente comando direttamente girare.
1
: Solo prima riga
2,$
: Tutte le righe a partire dalla seconda
$!
: Ogni riga diversa dall'ultima
Così espanso, questo è ciò che accade su ciascuna riga di un ingresso di linea N.
1: h, d
2: H, d
3: H, d
.
.
N-2: H, d
N-1: H, d
N: H, g
Al g
comando non viene assegnato un identificatore di linea, ma il d
comando precedente ha una clausola speciale " Avvia ciclo successivo " e ciò impedisce l' g
esecuzione su tutte le linee tranne l'ultima.
Per quanto riguarda il significato di ciascun comando:
- La prima
h
seguita da H
s su ogni riga copie dette linee di ingresso in sed
's hold space . (Pensa al buffer di testo arbitrario.)
- Successivamente,
d
scarta ogni riga per impedire che queste vengano scritte nell'output. Lo spazio di attesa viene tuttavia conservato.
- Infine, sull'ultima riga,
g
ripristina l'accumulo di ogni linea dallo spazio di attesa in modo che sed
sia in grado di eseguire la sua regex sull'intero input (piuttosto che in una linea alla volta), e quindi è in grado di partita su \n
s.