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 sedall'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 gcomando non viene assegnato un identificatore di linea, ma il dcomando precedente ha una clausola speciale " Avvia ciclo successivo " e ciò impedisce l' gesecuzione su tutte le linee tranne l'ultima.
Per quanto riguarda il significato di ciascun comando:
- La prima
hseguita da Hs su ogni riga copie dette linee di ingresso in sed's hold space . (Pensa al buffer di testo arbitrario.)
- Successivamente,
dscarta ogni riga per impedire che queste vengano scritte nell'output. Lo spazio di attesa viene tuttavia conservato.
- Infine, sull'ultima riga,
gripristina l'accumulo di ogni linea dallo spazio di attesa in modo che sedsia in grado di eseguire la sua regex sull'intero input (piuttosto che in una linea alla volta), e quindi è in grado di partita su \ns.