Potrzebujesz dosłownego znaku nowej linii, aby uciec. Przynajmniej w bash $''ciągi zostaną zastąpione \nprawdziwą nową linią, ale wtedy musisz podwoić odwrotny ukośnik, aby sed zobaczył, by uciec przed nową linią, np.
Dzięki za to - zastanawiałem się, dlaczego moja stara sztuczka z Linuksem nie działała w OSX. Ale to robi!
Wyatt8740
6
To jedyne rozwiązanie, które działa w skrypcie sed.
Firstrock
6
Zauważ, że backslash wymyka dosłowne przełamane (tak, to nie jest terminator poleceń): to nie postać linia kontynuacji (jak w bash, itd.). Aby zobaczyć różnicę, spróbuj napisać powyższe polecenie bez cudzysłowów: odwrotny ukośnik zostanie zinterpretowany przez powłokę jako znak kontynuacji linii, a on i nowa linia zostaną odrzucone. I odwrotnie, uwzględnij treść cytowanego wyrażenia (bez cudzysłowów) w osobnym pliku przecinka-newline.sed (co eliminuje składnię powłoki) i działa!
Nils von Barth,
1
jest to dobre, ponieważ może zastąpić wszystko, a nie postać. tr wydaje się działać tylko z postaciami. jeśli jako pierwszy parametr podasz ciąg znaków, zastąpi on wszystkie występujące znaki, a nie ciąg.
Shawn
1
@Droogans Czy używasz bash, sh lub innej powłoki? Czy na pewno używasz pojedynczych cudzysłowów zamiast podwójnych?
Max Nanasy,
22
Jeśli twoje użycie sed jest zazwyczaj wyrażeniem podstawienia (tak jak moje), możesz również użyć perl -petego
$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz
Działa na MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) i RHE Linux (Red Hat Enterprise Linux Server wersja 5.3, Tikanga) ...
$ sed 's/{pattern}/\^J/g' foo.txt > foo2.txt
... gdzie ^Jto się robi, wykonując ctrl+v + j. Nie przeszkadza to \przed ^J.
PS, wiem, że sed w RHEL jest GNU, sed MacOS jest oparty na FreeBSD i chociaż nie jestem pewien co do sed Solaris, wierzę, że będzie działać prawie z każdym sedem. YMMV tho ...
Byłoby to również odpowiednie dla konkursu Obfuscated C, z wyjątkiem Bash;)
Aaron R.
@AaronR. Zgadzam się :-). Z pewnością wolę trrozwiązanie, które jest już przyjętą odpowiedzią.
ryenus
1
To działało na OS X. Dlaczego jest to \n\rzamiast \r\n? Próbowałem, \r\nktóra jest niezbędna kolejność w systemie Windows. Jednak po zrobieniu tego pozostawia wiele ^Mznaków powrotu karetki vim, więc myślę, że to powinno być tylko, \nale \nsam nie działa.
NobleUplift
4
Chociaż spóźniłem się na ten post, po prostu aktualizuję swoje ustalenia. Ta odpowiedź dotyczy tylko systemu Mac OS X.
W powyższym poleceniu próbowałem z Shift + Enter, aby dodać nową linię, która nie działała. Więc tym razem próbowałem z „ucieczką” do „nowej linii bez zmian”, jak powiedział błąd.
Nie różni się to od odpowiedzi Maxa Nanasy'ego sprzed dwóch lat.
miken32
2
Dla wyjaśnienia: strona podręcznika użytkownika sed w OSX (10.8; Darwin Kernel wersja 12.4.0) mówi:
[...]
Sed Wyrażenia regularne
The regular expressions used in sed, by default, are basic regular expressions (BREs, see re_format(7) for more information), but extended
(modern) regular expressions can be used instead if the -E flag is given. In addition, sed has the following two additions to regular
expressions:
1. In a context address, any character other than a backslash (``\'') or newline character may be used to delimit the regular expression.
Also, putting a backslash character before the delimiting character causes the character to be treated literally. For example, in the
context address \xabc\xdefx, the RE delimiter is an ``x'' and the second ``x'' stands for itself, so that the regular expression is
``abcxdef''.
2. The escape sequence \n matches a newline character embedded in the pattern space. You cannot, however, use a literal newline charac-
ter in an address or in the substitute command.
[...]
więc myślę, że trzeba użyć tr - jak wspomniano powyżej - lub sprytnego
sed "s/,/^M
/g"
Uwaga: musisz wpisać < ctrl> -v, < return>, aby uzyskać '^ M' w edytorze vi
sedna macOS Mojave została wydana w 2005 roku, więc jednym z rozwiązań jest instalacja gnu-sed,
brew install gnu-sed
wtedy użycie gsedzrobi to, co chcesz,
gsed 's/,/\n/g' file
Jeśli wolisz sed, po prostu sudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew', co sugeruje brew info gnu-sed. Uruchom ponownie termin, a następnie sedw wierszu polecenia jest gsed.
FWIW, następujący wiersz działa w systemie Windows i zastępuje średniki w moich zmiennych ścieżki nową linią. Korzystam z narzędzi zainstalowanych w moim katalogu git bin.
tr , '\n'
. Myślę, że sed traktuje\n
jak zwykły tekst.tr , '\n' < file
- bez rury.g
koniec skryptu? Bez tego mam takie samo zachowanie.Odpowiedzi:
tr
Zamiast tego użyj :źródło
tr ',' ';' < input.csv > output.csv
Użyj ciągu cytowanego ANSI-C
$'string'
Potrzebujesz dosłownego znaku nowej linii, aby uciec. Przynajmniej w bash
$''
ciągi zostaną zastąpione\n
prawdziwą nową linią, ale wtedy musisz podwoić odwrotny ukośnik, aby sed zobaczył, by uciec przed nową linią, np.Zauważ, że to nie zadziała na wszystkich powłokach , ale zadziała na najpopularniejszych.
źródło
echo "a,b" | sed -e $'s/,/\\n/g
.man bash
.sed -E $'s/<\\/br>/\\\n/g' file
nie trzeba instalować gnu-sed-e
część wydaje się niepotrzebna.działa na Mac OS X.
źródło
Jeśli twoje użycie sed jest zazwyczaj wyrażeniem podstawienia (tak jak moje), możesz również użyć
perl -pe
tegoźródło
Najwyraźniej
\r
jest kluczem!Przekształciłem to:
Do tego:
źródło
\r
to nie to samo\n
, co może zakłócić dalszą manipulację danymi i ich wykorzystanie.\r
!Działa na MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) i RHE Linux (Red Hat Enterprise Linux Server wersja 5.3, Tikanga) ...
... gdzie
^J
to się robi, wykonując ctrl+v + j. Nie przeszkadza to\
przed^J
.PS, wiem, że sed w RHEL jest GNU, sed MacOS jest oparty na FreeBSD i chociaż nie jestem pewien co do sed Solaris, wierzę, że będzie działać prawie z każdym sedem. YMMV tho ...
źródło
MacOS jest inny, istnieją dwa sposoby rozwiązania tego problemu z sed w mac
najpierw użyj
\'$'\n''
replace\n
, może działać w systemie MacOS:po drugie, użyj pustej linii:
Ps. Zwróć uwagę na przedział oddzielony
'
po trzecie, użyj gnu-sed zamień mac-sed
źródło
Aby to zakończyć, działa to również:
źródło
tr
rozwiązanie, które jest już przyjętą odpowiedzią.\n\r
zamiast\r\n
? Próbowałem,\r\n
która jest niezbędna kolejność w systemie Windows. Jednak po zrobieniu tego pozostawia wiele^M
znaków powrotu karetkivim
, więc myślę, że to powinno być tylko,\n
ale\n
sam nie działa.Chociaż spóźniłem się na ten post, po prostu aktualizuję swoje ustalenia. Ta odpowiedź dotyczy tylko systemu Mac OS X.
W powyższym poleceniu próbowałem z Shift + Enter, aby dodać nową linię, która nie działała. Więc tym razem próbowałem z „ucieczką” do „nowej linii bez zmian”, jak powiedział błąd.
Pracował! (w Mac OS X 10.9.3)
źródło
Dla wyjaśnienia: strona podręcznika użytkownika sed w OSX (10.8; Darwin Kernel wersja 12.4.0) mówi:
[...]
Sed Wyrażenia regularne
[...]
więc myślę, że trzeba użyć tr - jak wspomniano powyżej - lub sprytnego
Uwaga: musisz wpisać < ctrl> -v, < return>, aby uzyskać '^ M' w edytorze vi
źródło
...
Działa dla mnie na Mojave
źródło
sed
na macOS Mojave została wydana w 2005 roku, więc jednym z rozwiązań jest instalacjagnu-sed
,wtedy użycie
gsed
zrobi to, co chcesz,Jeśli wolisz
sed
, po prostusudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew'
, co sugerujebrew info gnu-sed
. Uruchom ponownie termin, a następniesed
w wierszu polecenia jestgsed
.źródło
FWIW, następujący wiersz działa w systemie Windows i zastępuje średniki w moich zmiennych ścieżki nową linią. Korzystam z narzędzi zainstalowanych w moim katalogu git bin.
źródło