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

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

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

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

Ответ 1

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

tr , '\n' < file

Ответ 2

Используйте $'string'

Вам нужна обратная косая черта с линией, чтобы перейти к sed. По крайней мере в bash строки $'' заменят \n на новую строку новой строки, но тогда вам придется удвоить обратную косую черту, которую sed увидит, чтобы избежать новой строки, например.

echo "a,b" | sed -e $'s/,/\\\n/g'

Ответ 3

sed 's/,/\
/g'

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

Ответ 4

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

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

Ответ 5

Это работает на 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, MacOS sed - это FreeBSD, и, хотя я не уверен в отношении Solaris sed, я считаю, что это будет работать в значительной степени с любым sed. YMMV tho '...

Ответ 6

По-видимому \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

Ответ 7

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

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

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

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

Ответ 8

Чтобы завершить работу, это также работает:

echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"

Ответ 9

Хотя я опаздываю на этот пост, просто обновляю свои результаты. Этот ответ предназначен только для Mac OS X.

$ sed 's/new/
> /g' m1.json > m2.json
sed: 1: "s/new/
/g": unescaped newline inside substitute pattern

В приведенной выше команде я попытался с помощью Shift + Enter добавить новую строку, которая не сработала. Итак, на этот раз я попытался "ускользнуть" от "unescaped newline", как сказал ошибка.

$ sed 's/new/\
> /g' m1.json > m2.json 

Работает! (в Mac OS X 10.9.3)

Ответ 10

Просто, чтобы очистить: man-страница 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, < возврат > , чтобы получить '^ M' в редакторе vi

Ответ 11

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

echo %path% | sed -e $'s/;/\\n/g' | less

Ответ 12

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

...

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

Ответ 13

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.

Ответ 14

мы можем сделать это и в sed.

вы можете попробовать это,

sed -i~bak 's/\,/\n/g' file

-i - изменит модификацию файла. Будьте осторожны, чтобы использовать эту опцию.

Надеюсь, это поможет вам.