Sono così confuso con GNU sed, POSIX sede sedla miriade di opzioni di BSD . Come posso sostituire letterale \ncon il carattere di nuova riga usando questi tre sedtipi?
foo\\nbaro foo\\\nbar?
Sono così confuso con GNU sed, POSIX sede sedla miriade di opzioni di BSD . Come posso sostituire letterale \ncon il carattere di nuova riga usando questi tre sedtipi?
foo\\nbaro foo\\\nbar?
Risposte:
sed 's/\\n/\
/g'
Notare la barra rovesciata appena prima di premere return nella stringa di sostituzione.
sedcomando originale in Unix v7 nel 1979. L'unico posto in cui ciò potrebbe non funzionare sarebbero implementazioni ridotte non POSIX di sedsimili a quelle basate su busybox ridotte. Non funzionerà in csh ma è un problema di csh.
\\nviene utilizzato nella parte di ricerca, perché non utilizzare \nnella 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 sedrisposta portatile , ti dirò solo che sedraramente è 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.
awkha problemi di portabilità simili (è awksemplicemente vecchio awk, nawko 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).
awkportabilità, attenersi a una versione awkconforme 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 Holdspace è 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 \backspace ed \return e \00ottali e whathaveyou.
Con gnu sedil 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"