在sed中用换行符replace逗号

我有一个逗号分隔的ID文件。 我试图用一个新的行代替逗号。 我试过了:

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

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

tr代替:

 tr , '\n' < file 

使用$'string'

你需要一个反斜线转义的文字换行到达sed。 至less在bash中, $''string会用真正的换行符replace\n ,但是必须加倍sed将会看到的反斜线,例如换行

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

适用于Mac OS X.

如果你的sed用法往往是完全replaceexpression式(就像我的习惯一样),你也可以使用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(红帽企业Linux服务器版本5.3,Tikanga)…

 $ sed 's/{pattern}/\^J/g' foo.txt > foo2.txt 

^J是通过按ctrl + v + j完成的 。 请记住^J之前。

PS,我知道RHEL中的sed是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')/" 

虽然我迟到了这个职位,只是更新了我的发现。 这个答案只适用于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中)

只是为了澄清:OSX的man页(10.8;达尔文内核版本12.4.0)说:

[…]

Sed正则expression式

  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" 

注意:你必须在vi编辑器中input< ctrl> -v,< return>来获得'^ M'

FWIW,下面一行在Windows中工作,并用换行符replacepathvariables中的分号。 我正在使用安装在我的git bin目录下的工具。

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

我们也可以在sed中做到这一点。

你可以试试这个,

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

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

我希望这会帮助你。