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

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

sed 's/,/n/g' file

но это не работает. Что я упускаю?

12 ответов


использовать tr вместо:

tr , '\n' < file

использовать $'string'

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

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

sed 's/,/\
/g'

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


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

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

это работает на macOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) и RHE Linux (Red Hat Enterprise Linux Server release 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'...


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

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

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

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

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

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

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


хотя я опаздываю на этот пост, просто обновляю свои выводы. Этот ответ только для 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)


просто чтобы прояснить: 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 - как упоминалось выше-или nifty

sed "s/,/^M
/g"

Примечание: Вы должны ввести ctrl> - v,вернуться> чтобы получить "^M " в VI editor


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

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

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

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

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

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

Я надеюсь, что это поможет вам.