在MacOS上用换行符替换sed中的逗号?

我有一个用逗号分隔的字符串文件。我正试着用新的一行替换逗号。我试过了:

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

但这并不奏效。我错过了什么?

371105 次浏览

使用tr代替:

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

适用于Mac OS X。

为了使它完整,也可以这样做:

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

显然\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

只是为了澄清:OSX上sed的手册页(10.8;达尔文内核版本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 -如上所述-或者nitty

sed "s/,/^M
/g"

注意:你必须输入<ctrl >-v,<返回>才能在vi编辑器中得到'^M'

使用ANSI-C引用字符串 $'string'

你需要一个反斜杠转义的文字换行符来进入sed。 至少在bash中,$''字符串将用真正的换行符替换\n,但随后你必须将sed看到的反斜杠加倍以转义换行符,例如

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

注意这并不适用于所有的外壳,但将适用于最常见的。

这适用于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之前的\

另外,我知道RHEL的sed是GNU的,MacOS的sed是基于FreeBSD的,虽然我不确定Solaris的sed,但我相信这对任何sed都适用。YMMV tho”……

如果你的sed使用完全是替换表达式(就像我的一样),你也可以使用perl -pe代替

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

虽然我写这篇文章晚了,只是更新我的发现。这个答案只适用于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)

FWIW,下面的行工作在窗口和替换分号在我的路径变量换行。我正在使用安装在我的git bin目录下的工具。

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

MacOS是不同的,有两种方法来解决这个问题与mac的sed

  • 首先,使用\'$'\n''替换\n,它可以在MacOS中工作:

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

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

  • the third, use gnu-sed replace the mac-sed

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

...

在莫哈韦对我有用

macOS Mojave上的sed于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

我发现了另一个同样有效的命令。

find your_filename.txt -type f -exec sed -i 's/,/\n/g' {} \;