2009-09-14 18 views
13

Pozdrowienia, jak wykonać następujące czynności w BSD sed?Jak korzystać z zamiennika nowej linii w BSD sed?

sed 's/ /\n/g' 

od człowieka-strony stwierdza, że ​​\ n będą traktowane dosłownie w ciągu zastępowania, w jaki sposób uniknąć tego problemu? Czy istnieje alternatywa?

Używam Mac OS Snow Leopard można zainstalować Fink aby GNU sed.

+1

Mała korekta: '\ n' nie jest traktowany dosłownie jako taka zostanie przetłumaczony na dosłownym' n' (tj '\' jest spadła, ale to oczywiście jeszcze nie jest pożądany efekt). – mklement0

Odpowiedz

14

w powłoce, można zrobić:

sed 's/ /\ 
/g' 

naciskając klawisz ENTER po ukośnik, aby wstawić znak nowej linii.

+0

Fantastycznie, dzięki Wooble. Czy istnieje jakiś znany powód, dla którego BSD sed nie obsługuje \ n w łańcuchu zamiennym? Po prostu ciekawy. –

+0

Nie jestem pewien, ale wydaje się, że po prostu zdecydowali się nie obsługiwać ucieczek w ogóle w ciągu zastępowania. sed "y// \ n /" wydaje się działać, mimo że zastępuje tylko ciąg; jeśli chcesz zastąpić wyrażenie z wyrażeniem regularnym, to się nie powiedzie. Ponadto, \ n wydaje się być specjalnym cased; \ r z otrzymaniem "r", a nie powrotu karetki. – geoffspear

6

Innym sposobem:

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

Zobacz here.

+2

+1, ale zauważ, że jest to zależne od funkcji powłoki, [cytowanie ANSI C] (http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting) ('$ '.. . "), a niektóre powłoki go nie obsługują (np.' dash' - nie jest częścią POSIX). Ponadto ''// \ '$' \ n ''/g'' - wstawianie '$ '\ n'' pomiędzy dwoma ciągami z jednym cudzysłowem - jest koncepcyjnie czystsze i solidniejsze. Alternatywnie użyj '$ 's// \\\ n/g'' (zauważ, że musisz uciec z' \ '). – mklement0

4

Dla łatwości obsługi, ja osobiście często korzystają

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

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

więc pozostaje na 1 linię.

+1

Interesujące; czy mogę zaproponować wywołanie zmiennej 'nl' zamiast' cr'? Zakładając, że stosowanie powłoki, która wspiera [ANSI C, podając] (http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting) (przykład 'bash',' ksh', 'zsh '), możesz uprościć zadanie do' cr = $ '\ n''; wtedy nie musiałbyś się martwić różnicami w platformach. – mklement0

+0

fajna rada, sur o '$ '\ n'' na dowolnym" unixie "? to naprawdę pomoże (moje Słońce daje mi pewne problemy przy przypisywaniu/akcji w ten sposób z '\ n') – NeronLeVelu

+1

' $ '\ n'' (cytowanie ANSI-C) powinno działać, jeśli masz odpowiedni _shell_ ('bash', 'ksh' lub' zsh' - NIE tylko w POSIX-owych powłokach, takich jak 'dash', więc platforma nie powinna mieć znaczenia. ('bash' wprowadził tę cechę w wersji 2.0 (dawno temu) - nie jestem pewny co do' ksh' i 'zsh', ale oczekiwałbym, że obecne systemy będą miały wersje wystarczające do niedawna). – mklement0