2009-09-14 5 views
13

Saluti, come si esegue il seguente in BSD sed?Come si usa una sostituzione di nuova linea in un BSD sed?

sed 's/ /\n/g' 

Dall'uomo-page si afferma che \ n saranno trattati letteralmente all'interno di una stringa di sostituzione, come faccio a evitare questo comportamento? C'è un sostituto?

Sto utilizzando Mac OS Snow Leopard, posso installare fink per ottenere GNU sed.

+1

piccola correzione: '\ n 'non è trattata letteralmente come tale, si traduce per letterale' n (cioè la' \ 'è scesa, ma che ovviamente ancora non è il risultato desiderato). – mklement0

risposta

14

In un guscio, si può fare:

sed 's/ /\ 
/g' 

premendo il tasto enter dopo il backslash per inserire un ritorno a capo.

+0

Fantastico, grazie Wooble. C'è qualche motivo noto per cui BSD sed non supporta \ n nella stringa di sostituzione? Solo curioso. –

+0

Non sono sicuro, ma sembra che abbiano deciso di non supportare affatto gli escape nella stringa di sostituzione. sed 'y// \ n /' sembra funzionare, sebbene esegua solo la sostituzione di stringhe; se hai bisogno di sostituire il '' con una regex fallirà. Inoltre, il \ n sembra essere di tipo speciale; con una "r", non un ritorno a capo. – geoffspear

6

Un altro modo:

sed -e 's/ /\'$'\n/g' 

Vedi here.

+2

+1, ma si noti che questo si basa su una funzione di shell, [citazione ANSI C] (http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting) ('$ '.. .''), e alcune shell non lo supportano (ad esempio, 'dash' - non fa parte di POSIX). Inoltre, ''s// \' $ '\ n' '/ g'' - incunea un' $' \ n'' tra due stringhe a virgolette singole - è concettualmente più chiaro e più robusto. In alternativa, usa '$ 's// \\\ n/g'' (nota la necessità di sfuggire a' \ '). – mklement0

4

Per facilità d'uso, io personalmente uso spesso

cr="\n" 
# or (depending version and OS) 
cr=" 
" 

sed "s/ /\\${cr}/g" 

in modo che rimanga su 1 linea.

+1

Interessante; posso suggerire di chiamare la variabile 'nl' piuttosto che' cr'? Supponendo che tu usi una shell che supporti [Citazione ANSI C] (http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting) (ad esempio, 'bash',' ksh', 'zsh '), potresti semplificare l'assegnazione a' cr = $ '\ n''; quindi non dovresti preoccuparti delle differenze di piattaforma. – mklement0

+0

consigli interessanti, a proposito di '$ '\ n'' su qualsiasi" unix "? sarà davvero d'aiuto (il mio Sun mi darà qualche problema sull'assegnazione/azione del genere con '\ n') – NeronLeVelu

+1

' $ '\ n'' (quotazione ANSI-C) dovrebbe funzionare se si ha il diritto _shell_ ('bash', 'ksh', o' zsh' - NON in shell con funzioni POSIX come 'dash', comunque), quindi la piattaforma non dovrebbe avere importanza. ('bash' ha introdotto la funzione nella versione 2.0 (un po 'di tempo fa) - non sono sicuro di' ksh' e 'zsh', ma mi aspetto che i sistemi attuali abbiano versioni abbastanza recenti). – mklement0