Ho un file di testo ("INPUT.TXT") del formato:UNIX: Sostituire Newline w/Colon, Preservare Newline Prima EOF
A<LF>
B<LF>
C<LF>
D<LF>
X<LF>
Y<LF>
Z<LF>
<EOF>
che ho bisogno di riformattare a:
A:B:C:D:X:Y:Z<LF>
<EOF>
So che puoi farlo con "sed". C'è un miliardo di hit di Google per fare ciò con "sed". Ma sto cercando di enfatizzare la leggibilità, la semplicità e l'utilizzo dello strumento corretto per il lavoro corretto. 'sed' è un editor di riga che consuma e nasconde i newline. Probabilmente non è lo strumento giusto per questo lavoro!
Penso che lo strumento corretto per questo lavoro sarebbe "tr". Posso sostituire tutte le newline con due punti con il comando:
cat INPUT.txt | tr '\n' ':'
C'è il 99% del mio lavoro svolto. Ho un problema, ora, però. Sostituendo tutte le newline con i due punti, non solo ottengo un colon estraneo alla fine della sequenza, ma perdo anche il ritorno a capo alla fine dell'input. Assomiglia a questo:
A:B:C:D:X:Y:Z:<EOF>
Ora, ho bisogno di rimuovere i due punti dalla fine dell'input. Tuttavia, se provo a passare questo input elaborato attraverso 'sed' per rimuovere il colon finale (che ora, penso, sia un uso corretto di 'sed'), mi trovo con un secondo problema. L'input non è più terminato da un newline! 'sed' fallisce completamente, per tutti i comandi, perché non trova mai la fine della prima riga di input!
Sembra che l'aggiunta di una nuova riga alla fine di alcuni input sia un compito molto, molto comune, e considerando che io stesso ero solo tentato di scrivere un programma per farlo in C (che richiederebbe circa otto righe di codice), Non riesco a immaginare che non ci sia già un modo molto semplice per farlo con gli strumenti già disponibili nel kernel di Linux.
All'inizio ero sconcertato sul motivo per cui avresti postato come soluzione la cosa esatta che ho detto non funzionava, quindi l'ho provato su un'altra macchina. Mi sono reso conto che il server Sun su cui avevo bisogno della soluzione non stava usando GNU "sed". La versione di "sed" sul server ha esito negativo quando l'input non ha terminazioni di fine riga, quindi, come delineato, perché ho usato "echo". ((Il server è un dispositivo mission critical al lavoro che non ha mai fallito e, quindi, non è mai stato riavviato, tanto meno aggiornato, negli anni.) La soluzione loop shell è fantastica, anche se . – Maarx
/bin/sed su Sun ... ick. Che ne dici di/usr/xpg4/bin/sed? –