У меня есть файл строк, разделенных запятыми. Пытаюсь заменить запятые на новую строку. Я пробовал:
sed 's/,/\n/g' file
Но это не работает. Что мне не хватает?
У меня есть файл строк, разделенных запятыми. Пытаюсь заменить запятые на новую строку. Я пробовал:
sed 's/,/\n/g' file
Но это не работает. Что мне не хватает?
Вместо этого используйте tr
:
tr , '\n' < file
tr ',' ';' < input.csv > output.csv
- person Wim Deblauwe; 24.02.2016
Используйте строку в кавычках ANSI-C $'string'
Для перехода к sed вам нужен буквальный символ новой строки с экранированной обратной косой чертой. По крайней мере, в bash $''
строки заменят \n
настоящей новой строкой, но тогда вам нужно удвоить обратную косую черту, которую sed увидит, чтобы избежать новой строки, например
echo "a,b" | sed -e $'s/,/\\\n/g'
Обратите внимание, не будет работают на всех оболочках, но будут работать и на самых распространенных.
echo "a,b" | sed -e $'s/,/\\n/g
.
- person Alexandre Holden Daly; 02.07.2014
man bash
.
- person tboyce12; 01.04.2015
sed -E $'s/<\\/br>/\\\n/g' file
, устанавливать gnu-sed не нужно
- person Brice; 14.06.2016
-e
кажется ненужной.
- person Yongwei Wu; 22.07.2016
sed $'s/:/\\\n'/g <<<$PATH
- person 7stud; 14.01.2017
fzf
для отладки моего $ PATH на случай, если чего-то не хватает: echo $PATH | sed -e $'s/:/\\\n/g' | fzf
^. ^
- person SidOfc; 31.08.2017
gsed -e 's/,/\n/g'
работает на gnu-sed версии 4.4-1.
- person mchid; 11.01.2018
echo foo,bar | sed $'s/,/\\n/g'
. убунту. sed (GNU sed) 4.2.2
- person Hawkeye Parker; 09.07.2018
-e
неявно используется, если вы указываете только одну команду. Если требуется более одной команды: sed -e 's/foo/bar' -e 's/boo/far'
.
- person Daghall; 17.09.2020
sed 's/,/\
/g'
работает в Mac OS X.
sed $'s/,/\\\n/'
, чтобы все было в одной строке
- person Wivlaro; 14.02.2017
Если ваше использование sed имеет тенденцию быть полностью выражениями подстановки (как и мое), вы также можете вместо этого использовать perl -pe
$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz
MacOS отличается, есть два способа решить эту проблему с помощью sed в Mac
сначала используйте \'$'\n''
replace \n
, это может работать в MacOS:
sed 's/,/\'$'\n''/g' file
второй, просто используйте пустую строку:
sed 's/,/\
/g' file
Пс. Обратите внимание на диапазон, разделенный '
в-третьих, используйте gnu-sed, замените mac-sed
Видимо \r
это ключ!
$ sed 's/, /\r/g' file3.txt > file4.txt
Преобразовал это:
ABFS, AIRM, AMED, BOSC, CALI, ECPG, FRGI, GERN, GTIV, HSON, IQNT, JRCC, LTRE,
MACK, MIDD, NKTR, NPSP, PME, PTIX, REFR, RSOL, UBNT, UPI, YONG, ZEUS
К этому:
ABFS
AIRM
AMED
BOSC
CALI
ECPG
FRGI
GERN
GTIV
HSON
IQNT
JRCC
LTRE
MACK
MIDD
NKTR
NPSP
PME
PTIX
REFR
RSOL
UBNT
UPI
YONG
ZEUS
\r
- это не то же самое, что \n
, и это может помешать дальнейшему манипулированию данными и их использованию.
- person Joel Purra; 11.10.2014
\r
!
- person pir; 28.08.2017
Это работает на MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) и RHE Linux (Red Hat Enterprise Linux Server, выпуск 5.3, Tikanga) ...
$ sed 's/{pattern}/\^J/g' foo.txt > foo2.txt
... где ^J
выполняется с помощью ctrl + v + j. Обратите внимание на \
перед ^J
.
PS, я знаю, что sed в RHEL - это GNU, sed для MacOS основан на FreeBSD, и хотя я не уверен в sed Solaris, я считаю, что он будет работать в значительной степени с любым sed. YMMV хотя '...
Чтобы сделать его полным, это также работает:
echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
tr
решение, которое уже является принятым ответом.
- person ryenus; 24.03.2014
\n\r
вместо \r\n
? Я пробовал \r\n
, что является необходимым порядком в Windows. Однако после того, как я это сделаю, он оставляет много ^M
символов возврата каретки в vim
, поэтому я думаю, что это должно быть только \n
, но только \n
не работает.
- person NobleUplift; 24.03.2017
Хотя я опаздываю на этот пост, просто обновляю свои выводы. Этот ответ предназначен только для Mac OS X.
$ sed 's/new/
> /g' m1.json > m2.json
sed: 1: "s/new/
/g": unescaped newline inside substitute pattern
В приведенной выше команде я попытался с помощью Shift + Enter добавить новую строку, которая не сработала. Итак, на этот раз я попытался «избежать» «неэкранированной новой строки», как указано в ошибке.
$ sed 's/new/\
> /g' m1.json > m2.json
Сработало! (в Mac OS X 10.9.3)
$ echo $PATH | sed -e $'s/:/\\\n/g'
/usr/local/sbin
/Library/Oracle/instantclient_11_2/sdk
/usr/local/bin
...
У меня работает в Мохаве
Просто чтобы прояснить: справочная страница sed для OSX (10.8; Darwin Kernel Version 12.4.0) говорит:
[...]
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.
[...]
поэтому я думаю, что нужно использовать tr - как упоминалось выше - или изящный
sed "s/,/^M
/g"
примечание: вам нужно ввести ‹ctrl> -v,‹ return>, чтобы получить '^ M' в редакторе vi
sed
в macOS Mojave был выпущен в 2005 году, поэтому одним из решений является установка gnu-sed
,
brew install gnu-sed
тогда используйте gsed
будет делать то, что вы хотите,
gsed 's/,/\n/g' file
Если вы предпочитаете sed
, просто sudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew'
, что предлагает brew info gnu-sed
. Перезагрузите свой термин, тогда ваш sed
в командной строке будет gsed
.
FWIW, следующая строка работает в окнах и заменяет точки с запятой в моих переменных пути на новую строку. Я использую инструменты, установленные в моем каталоге git bin.
echo %path% | sed -e $'s/;/\\n/g' | less
tr , '\n'
. Я думаю, sed рассматривает\n
как простой текст. - person Prince John Wesley   schedule 25.05.2012tr , '\n' < file
- трубы нет. - person Prince John Wesley   schedule 25.05.2012g
в конце скрипта? У меня такое же поведение и без него. - person HelloGoodbye   schedule 27.05.2015g
заменит все экземпляры символа, тогда как отсутствиеg
заменит только первый экземпляр этого символа в строке. - person mchid   schedule 11.01.2018