Sono così confuso con GNU sed
, POSIX sed
e sed
la miriade di opzioni di BSD . Come posso sostituire letterale \n
con il carattere di nuova riga usando questi tre sed
tipi?
foo\\nbar
o foo\\\nbar
?
Sono così confuso con GNU sed
, POSIX sed
e sed
la miriade di opzioni di BSD . Come posso sostituire letterale \n
con il carattere di nuova riga usando questi tre sed
tipi?
foo\\nbar
o foo\\\nbar
?
Risposte:
sed 's/\\n/\
/g'
Notare la barra rovesciata appena prima di premere return nella stringa di sostituzione.
sed
comando originale in Unix v7 nel 1979. L'unico posto in cui ciò potrebbe non funzionare sarebbero implementazioni ridotte non POSIX di sed
simili a quelle basate su busybox ridotte. Non funzionerà in csh ma è un problema di csh.
\\n
viene utilizzato nella parte di ricerca, perché non utilizzare \n
nella sostituzione? il primo sembra implicare che il secondo esista. vale a dire. perché no$ echo '1\n2'|sed 's/\\n/\n/g'
\n
è un valore letterale, il che implica che appare come i due personaggi: colpo di coda seguito da n
, e non come un singolo carattere di nuova riga. Quindi, due barre rovesciate per rendere la barra rovesciata letterale e quindin
Dato che hai già la tua sed
risposta portatile , ti dirò solo che sed
raramente è lo strumento migliore se devi in qualche modo manipolare le nuove linee. Perl è quasi portatile quanto sed
, è installato di default sulla maggior parte dei sistemi * nix e può gestirlo molto facilmente:
printf '%s\n' 'aa\nbb' | perl -pe 's/\\n/\n/g'
Un'altra scelta molto portatile è awk
:
printf '%s\n' 'aa\nbb' | awk '{gsub("\\\\n","\n")};1'
Su Solaris, ricordati di usare lo standard awk in / usr / xpg4 / bin, quello in / bin è storico e non dovrebbe essere usato per i nuovi script.
awk
ha problemi di portabilità simili (è awk
semplicemente vecchio awk
, nawk
o gawk
?). In realtà, manca la versione nelle mie scatole di Solaris gsub()
. Il mio voto qui è per Perl ( perl -nlawe '...'
approssima il comportamento automatico di awk
).
awk
portabilità, attenersi a una versione awk
conforme a POSIX e utilizzare solo quelle funzionalità e si dovrebbe andare bene. Su Solaris ne troverai uno come /usr/xpg4/bin/awk
.
echo "aa\nbb" | awk '{gsub(/\\n/,"\n");}1;'
?
gsub()
dovrebbe funzionare praticamente ovunque. Anche busybox ha un awk
.
Se H
oldspace è vuoto puoi anche fare:
sed '/\\n/G;s/\\n\(.*\)\(.\)/\2\1/;P;D'
... ma la risposta di uxnut è già più veloce e più semplice, quindi puoi prenderla come vuoi.
Un'altra possibilità estranea:
INPUT | sed -n l | while read v ; do printf "${v%?}" ; done
Ma attenzione, ^ che traduce tutte le \
fughe backslash in stile C standard - come \b
ackspace ed \r
eturn e \00
ottali e whathaveyou.
Con gnu sed
il seguente funziona anche:
gsed -n -e 'H;${x;s/\\n/\n/g;p;}'
Hai bisogno di una soluzione in sed, e che è già stata data di seguito. Ma volevo aggiungere un'altra possibilità che IMHO fosse semplicemente più facile e veloce,
tr -d "\n"