Sostituisci \ n con una nuova riga in modo portabile


23

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?


Hanno molte cose diverse, quale parte vuoi sapere?
cuonglm,

@Gnouc penso che ora sia chiaro.
Avinash Raj,

1
Hai dato un'occhiata a questa domanda ?
groxxda,

2
Cosa vuoi che accada in input come foo\\nbaro foo\\\nbar?
Gilles 'SO- smetti di essere malvagio' il

semplice, foo \\ nella riga successiva sarebbe bar.
Avinash Raj,

Risposte:


30
sed 's/\\n/\
/g'

Notare la barra rovesciata appena prima di premere return nella stringa di sostituzione.


funziona per tutti i tipi di sed?
Avinash Raj,

Credo che dovrebbe; Ho provato solo su Linux usando la versione gnu.
Unxnut

11
@AvinashRaj. Questo è POSIX e ha funzionato con il 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.
Stéphane Chazelas,

Poiché \\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'

In questo caso, \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
unxnut

9

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.


Direi che 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).
ariel,

2
@arielCo: per la 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.
Scrutinizer,


@arielCo in realtà, awk è più portatile di perl. Il mio secondo approccio awk che non usa gsub()dovrebbe funzionare praticamente ovunque. Anche busybox ha un awk.
terdon

1
gsub () è POSIX (gsub, è stato aggiunto in SVR3.1, POSIX awk si basa su SVR4 con alcune aggiunte vedere il manuale di gawk per ulteriori informazioni), gensub () è l'estensione GNU. Il awk originale si trovava ancora come / bin / awk su Solaris, non supportava gsub (), ma non supportava nemmeno un FS multi-carattere.
Stéphane Chazelas,

1

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.


0

Con gnu sedil seguente funziona anche:

gsed -n -e 'H;${x;s/\\n/\n/g;p;}'

-2

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"

1
cosa fa questo? cancellare tutte le newline dall'input?
Mikeserv,

Sì, è esattamente quello che fa
jpmuc il

5
ma perché? che cosa ha a che fare con la domanda?
Mikeserv,

1
Questo rimuove semplicemente "\ n" quando la domanda è come sostituire la stringa "\ n" con le nuove righe effettive.
spuder,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.