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

228

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

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

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

tr , '\n' < file - нет трубы. Prince John Wesley
Это сработало! кошачий файл | tr, \ n; WildBill
пытатьсяtr , '\n', Я полагаю, Sed лечит\n в виде простого текста. Prince John Wesley
Чтоg в конце сценария для? Я получаю такое же поведение без него. HelloGoodbye
Какую оболочку вы используете? Это работает для меня, используя оболочку bash. HelloGoodbye

Ваш Ответ

12   ответов
6

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

  • first ,use \'$'\n'' replace \n, it can work in MacOS:

    sed 's/,/\'$'\n''/g' file
    
  • the second, just use an empty line:

    sed 's/,/\
    /g' file
    
  • Ps. Pay attention the range separated by '

5

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

echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
Error: User Rate Limit Exceeded\n\rError: User Rate Limit Exceeded\r\nError: User Rate Limit Exceeded\r\nError: User Rate Limit Exceeded^MError: User Rate Limit ExceededvimError: User Rate Limit Exceeded\nError: User Rate Limit Exceeded\nError: User Rate Limit Exceeded
Error: User Rate Limit ExceededtrError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
4

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

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

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

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

Worked! (in Mac OS X 10.9.3)

Error: User Rate Limit Exceeded
-2

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

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

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

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

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

Error: User Rate Limit Exceeded,Error: User Rate Limit ExceedednError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2

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

[...]

Sed Regular Expressions

 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"

примечание: вы должны ввести & lt;ctrl>-v, & л;return> чтобы получить «^ M»; в редакторе vi

11

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

0

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

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

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

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

По-видимому\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
Error: User Rate Limit Exceeded\r!
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededstackoverflow.com/questions/1761051/difference-between-n-and-r
Error: User Rate Limit Exceeded\rError: User Rate Limit Exceeded\nError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
292

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

tr , '\n' < file
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededtr ',' ';' < input.csv > output.csv
Error: User Rate Limit Exceeded
262

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

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

echo "a,b" | sed -e $'s/,/\\\n/g'
Error: User Rate Limit Exceeded-eError: User Rate Limit Exceeded
Error: User Rate Limit Exceededbrew install gnu-sedError: User Rate Limit Exceededgsed $'s/,/\\n/g'Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededsed -E $'s/<\\/br>/\\\n/g' fileError: User Rate Limit Exceeded
Error: User Rate Limit Exceededman bash.
Error: User Rate Limit Exceededecho "a,b" | sed -e $'s/,/\\n/g.
109
sed 's/,/\
/g'

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

Error: User Rate Limit Exceeded\nError: User Rate Limit Exceeded\\nError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededescapesError: User Rate Limit ExceedednotError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы