Заменить запятую на новую строку в sed на MacOS?

У меня есть файл строк, разделенных запятыми. Пытаюсь заменить запятые на новую строку. Я пробовал:

sed 's/,/\n/g' file

Но это не работает. Что мне не хватает?


person WildBill    schedule 25.05.2012    source источник
comment
попробуйте tr , '\n'. Я думаю, sed рассматривает \n как простой текст.   -  person Prince John Wesley    schedule 25.05.2012
comment
Это сработало! файл кошки | tr, '\ n'   -  person WildBill    schedule 25.05.2012
comment
tr , '\n' < file - трубы нет.   -  person Prince John Wesley    schedule 25.05.2012
comment
Для чего g в конце скрипта? У меня такое же поведение и без него.   -  person HelloGoodbye    schedule 27.05.2015
comment
Какую оболочку вы используете? У меня это работает, используя оболочку bash.   -  person HelloGoodbye    schedule 27.05.2015
comment
@HelloGoodbye g заменит все экземпляры символа, тогда как отсутствие g заменит только первый экземпляр этого символа в строке.   -  person mchid    schedule 11.01.2018
comment
Простите, @PrinceJohnWesley: есть ли преимущество в отсутствии трубопроводов? Может быть, более быстрая обработка или лучшее управление ОЗУ?   -  person Sopalajo de Arrierez    schedule 25.01.2018
comment
См. Также обратный вопрос: unix. stackexchange.com/questions/114943/   -  person ryenus    schedule 17.04.2019


Ответы (13)


Вместо этого используйте tr:

tr , '\n' < file
person Prince John Wesley    schedule 25.05.2012
comment
Это не работает в оболочке bash $ tr, использование '\ n' aitr: tr [-Ccsu] string1 string2 tr [-Ccu] -d string1 tr [-Ccu] -s string1 tr [-Ccu] -ds string1 string2 - person Learner; 20.01.2016
comment
Замена запятой на точку с запятой также работает: 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'

Обратите внимание, не будет работают на всех оболочках, но будут работать и на самых распространенных.

person Walter Mundt    schedule 23.08.2013
comment
странно, он работает и с одним обратным слэшем меньше, т.е. echo "a,b" | sed -e $'s/,/\\n/g. - person Alexandre Holden Daly; 02.07.2014
comment
Проголосовали. Для получения дополнительной информации см. Раздел ЦИТАТЫ man bash. - person tboyce12; 01.04.2015
comment
Работает с OSX 10.11: sed -E $'s/<\\/br>/\\\n/g' file, устанавливать gnu-sed не нужно - person Brice; 14.06.2016
comment
Проверена работа на OS X 10.7 на данном примере. Часть -e кажется ненужной. - person Yongwei Wu; 22.07.2016
comment
OSX 10.10.5 требует 3 обратной косой черты: sed $'s/:/\\\n'/g <<<$PATH - person 7stud; 14.01.2017
comment
Это круто! Использование этого с fzf для отладки моего $ PATH на случай, если чего-то не хватает: echo $PATH | sed -e $'s/:/\\\n/g' | fzf ^. ^ - person SidOfc; 31.08.2017
comment
@Brice Я думаю, что gsed -e 's/,/\n/g' работает на gnu-sed версии 4.4-1. - person mchid; 11.01.2018
comment
Кажется, мне не нужен '-e': echo foo,bar | sed $'s/,/\\n/g'. убунту. sed (GNU sed) 4.2.2 - person Hawkeye Parker; 09.07.2018
comment
Спасибо, есть ли ссылка на документацию по этому поводу, пожалуйста? - person smarber; 17.08.2019
comment
@YongweiWu, -e неявно используется, если вы указываете только одну команду. Если требуется более одной команды: sed -e 's/foo/bar' -e 's/boo/far'. - person Daghall; 17.09.2020

sed 's/,/\
/g'

работает в Mac OS X.

person Max Nanasy    schedule 07.09.2012
comment
Спасибо за это - интересно, почему мой старый трюк с Linux не работает в OSX. Но это действительно так! - person Wyatt Ward; 10.05.2014
comment
Это единственное решение, которое работает в сценарии sed. - person Firstrock; 12.05.2014
comment
Обратите внимание, что обратная косая черта экранирует буквальную новую строку (так что это не признак конца команды): это не символ продолжения строки (как в bash и т. Д.). Чтобы увидеть разницу, попробуйте написать указанную выше команду без кавычек: обратная косая черта будет интерпретироваться оболочкой как символ продолжения строки, и она и новая строка будут отброшены. И наоборот, включите содержимое цитируемого выражения (без кавычек) в отдельный файл comma-to-newline.sed (который исключает синтаксис оболочки), и это сработает! - person Nils von Barth; 11.10.2014
comment
это хорошо, так как может заменить что угодно, но не персонажа. tr вроде работает только с символами. если вы поместите строку в качестве первого параметра, она заменит все вхождения символов, а не строку. - person Shawn; 09.03.2015
comment
Я нахожусь в Йосемити, и я не мог заставить это работать, пока я не заменил экранированный буквальный символ новой строки двумя обратными косыми чертами, а не одним. - person Droogans; 05.08.2015
comment
@Droogans Вы используете bash, sh или другую оболочку? Вы уверены, что используете одинарные кавычки вместо двойных? - person Max Nanasy; 10.08.2015
comment
Я могу подтвердить, что это не работает на Йосемити. Я использую одинарные кавычки, и у меня это не работает в OSX 10.10.5. Независимо от того, сколько обратных косых черт я использую, я получаю сообщение об ошибке: недопустимый код команды \ - person 7stud; 14.01.2017
comment
Это дало мне ключ к разгадке. Я так и сделал: sed $'s/,/\\\n/', чтобы все было в одной строке - person Wivlaro; 14.02.2017

Если ваше использование sed имеет тенденцию быть полностью выражениями подстановки (как и мое), вы также можете вместо этого использовать perl -pe

$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz
person nar8789    schedule 15.04.2014

MacOS отличается, есть два способа решить эту проблему с помощью sed в Mac

  • сначала используйте \'$'\n'' replace \n, это может работать в MacOS:

    sed 's/,/\'$'\n''/g' file
    
  • второй, просто используйте пустую строку:

    sed 's/,/\
    /g' file
    
  • Пс. Обратите внимание на диапазон, разделенный '

  • в-третьих, используйте gnu-sed, замените mac-sed

person Felix    schedule 13.03.2018

Видимо \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
person Community    schedule 10.08.2013
comment
Я знаю, что вопрос касается OS X, но это не работает с GNU sed-4.2.2-6.fc20.x86_64. - person Cristian Ciupitu; 25.05.2014
comment
Имейте в виду, что \r - это не то же самое, что \n, и это может помешать дальнейшему манипулированию данными и их использованию. - person Joel Purra; 11.10.2014
comment
Извините, у меня это не сработало. Я только что получил букву «r» там, где должна быть новая строка. - person Frank de Groot - Schouten; 31.05.2017
comment
Вы должны пояснить в ответе, что это дает \r! - person pir; 28.08.2017
comment
У меня это сработало, но мне интересно, почему! \ n - это стандарт в unix stackoverflow.com/questions/ 1761051 / разница-между-н-и-р - person Alex; 15.01.2019
comment
У меня это тоже не сработало. Я использую macos 10.13, используя / usr / bin / sed. - person Chris; 05.09.2019

Это работает на 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 хотя '...

person Ramon Rey    schedule 13.01.2014

Чтобы сделать его полным, это также работает:

echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
person ryenus    schedule 17.07.2013
comment
Это также подошло бы для конкурса Obfuscated C, за исключением Bash;) - person Aaron R.; 18.03.2014
comment
@AaronR. Я согласен :-). Конечно, я предпочитаю tr решение, которое уже является принятым ответом. - person ryenus; 24.03.2014
comment
Это сработало в OS X. Почему это \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)

person user2300875    schedule 17.06.2014
comment
Это ничем не отличается от ответа Макса Нанаси за два года до вашего. - person miken32; 05.02.2016

$ echo $PATH | sed -e $'s/:/\\\n/g' 
/usr/local/sbin
/Library/Oracle/instantclient_11_2/sdk
/usr/local/bin

...

У меня работает в Мохаве

person Paulo Henrique Lellis Gonalves    schedule 26.04.2019

Просто чтобы прояснить: справочная страница sed для OSX (10.8; Darwin Kernel Version 12.4.0) говорит:

[...]

Регулярные выражения Sed

 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

person t3az0r    schedule 20.08.2013

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.

person DawnSong    schedule 24.05.2019

FWIW, следующая строка работает в окнах и заменяет точки с запятой в моих переменных пути на новую строку. Я использую инструменты, установленные в моем каталоге git bin.

echo %path% | sed -e $'s/;/\\n/g' | less
person Jeff LaFay    schedule 30.10.2014