在MacOS上用sed替换逗号换行?

时间:2012-05-25 04:25:01

标签: macos unix sed

我有一个以逗号分隔的id文件。我正在尝试用新行替换逗号。我试过了:

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

但它不起作用。我错过了什么?

14 个答案:

答案 0 :(得分:304)

改为使用tr

tr , '\n' < file

答案 1 :(得分:274)

使用$'string'

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

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

答案 2 :(得分:112)

sed 's/,/\
/g'

适用于Mac OS X.

答案 3 :(得分:21)

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

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

答案 4 :(得分:14)

适用于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

...通过 ctrl + v + j 完成^J。请注意\之前的^J

PS,我知道RHEL中的sed是GNU,MacOS sed是基于FreeBSD的,虽然我不确定Solaris sed,但我相信这对任何sed都有用。 YMMV tho'...

答案 5 :(得分:13)

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

答案 6 :(得分:7)

MacOS不同,有两种方法可以用mac中的sed解决这个问题

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

    sed 's/,/\'$'\n''/g' file
    
  • 第二个,只需使用空行:

    sed 's/,/\
    /g' file
    
  • 聚苯乙烯。请注意'

  • 分隔的范围

答案 7 :(得分:5)

为了完成它,这也有效:

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

答案 8 :(得分:4)

虽然我迟到了这篇文章,但只是更新我的发现。这个答案仅适用于 Mac OS X。

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

在上面的命令中,我尝试使用Shift + Enter添加新行,但该行无法正常工作。所以这次我尝试了&#34;逃避&#34; &#34;未转义的换行符&#34;正如错误所说。

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

<强>工作! (在Mac OS X 10.9.3中)

答案 9 :(得分:2)

只是为了澄清:OSX上的sed的man-page(10.8; Darwin内核版本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"

注意:您必须输入&lt; ctrl&gt; -v,&lt; return&gt; 才能在vi编辑器中获取“^ M”

答案 10 :(得分:0)

FWIW,以下行在Windows中工作,并用换行符替换路径变量中的分号。我正在使用我的git bin目录下安装的工具。

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

答案 11 :(得分:0)

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

...

在Mojave上为我工作

答案 12 :(得分:0)

sed on 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建议的。重新开始您的任期,然后您在命令行中的sedgsed

答案 13 :(得分:-2)

我们也可以在sed中这样做。

你可以试试这个,

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

-i - 将更改文件中的修改。请小心使用此选项。

我希望这会对你有所帮助。