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


286

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

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

但它不起作用。我想念什么?


12
尝试一下tr , '\n'。我想,sed \n视作纯文本。
约翰·卫斯理亲王

1
可行!猫文件| TR, '\ n'
WildBill

7
tr , '\n' < file-没有管道。
约翰·卫斯理亲王

是什么g在脚本的结束?没有它,我也会得到相同的行为。
HelloGoodbye,2015年

您正在使用什么外壳?这对我有用,使用bash shell。
HelloGoodbye 2015年

Answers:


361

使用tr来代替:

tr , '\n' < file

我正在寻找替换'。期间,这就是我正在寻找的解决方案:)
乔纳(Jonah)2015年

1
它在bash shell $ tr中不会起作用,'\ n'aitr用法:tr [-Ccsu] string1 string2 tr [-Ccu] -d string1 tr [-Ccu] -s string1 tr [-Ccu] -ds string1 string2
Learner

5
用分号替换逗号也可以:tr ',' ';' < input.csv > output.csv
Wim Deblauwe

304

使用ANSI-C引号引起来的字符串 $'string'

您需要使用反斜杠转义的文字换行符才能实现sed。至少在bash中,$''字符串将替换\n为真实的换行符,但是您必须将sed看到的反斜杠加倍以避开换行符,例如

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

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


5
奇怪的是,它也可以减少一个反斜线即ie echo "a,b" | sed -e $'s/,/\\n/g
Alexandre Holden Daly 2014年

2
已投票。有关更多信息,请参见的“ QUOTING”部分man bash
tboyce12 2015年

7
可以与OSX 10.11一起使用:sed -E $'s/<\\/br>/\\\n/g' file,无需安装gnu-sed
Brice

2
通过给定的示例验证了在OS X 10.7上的工作能力。该-e部分似乎没有必要。
吴永伟

1
答案示例立即在OSX 10.11.5中为我工作
Jurriaan Roelofs

122
sed 's/,/\
/g'

在Mac OS X上工作。


3
谢谢-想知道为什么我的旧Linux技巧在OSX中不起作用。但是,确实如此!
Wyatt8740 2014年

6
这是在sed脚本中起作用的唯一解决方案。
Firstrock的

6
请注意,反斜杠转义了文字换行符(因此它不是命令终止符):它不是行继续符(如bash等)。要了解两者之间的区别,请尝试使用上面的命令而不使用引号:反斜杠将由Shell解释为行连续字符,并且它将与换行符一起丢弃。相反,将带引号的表达式的内容(不带引号)包含在一个单独的comma-to-newline.sed文件中(该文件消除了shell语法),并且可以正常工作!
尼尔斯·冯·巴特

1
这很好,因为它可以替换任何东西,而不是字符。tr似乎只能使用字符。如果将字符串作为第一个参数,它将替换所有出现的字符,而不是字符串。
肖恩

1
@Droogans您使用的是bash,sh还是其他Shell?您确定使用单引号而不是双引号吗?
Max Nanasy

22

如果您的SED的使用往往是完全替换表达式(如矿山往往是),你也可以使用perl -pe替代

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

15

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

我知道问题是OS X,但这不适用于GNU sed-4.2.2-6.fc20.x86_64。
Cristian Ciupitu 2014年

10
请记住,这\r与并不相同\n,这可能会破坏进一步的数据操作和使用。
乔尔·普拉

3
抱歉,这对我不起作用。我刚得到一个“ r”,其中应该有一个换行符。
弗兰克·德格鲁特-舒滕

您应该在给出的答案中更加清楚\r
pir

它为我工作,但我不知道为什么!\ n是unix stackoverflow.com/questions/1761051/difference-between-n-and-r
Alex

15

这适用于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,我知道RHEL中的sed是GNU,MacOS sed是基于FreeBSD的,尽管我不确定Solaris sed,但我相信这对任何sed都可以工作。YMMV通过...


12

MacOS不同,mac中的sed有两种解决此问题的方法

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

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

    sed 's/,/\
    /g' file
    
  • 附言 注意范围由 '

  • 第三,使用gnu-sed替换mac-sed


7

要使其完整,这也可以:

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

1
这也很适合混淆C竞赛,除了Bash;)
Aaron R.

@AaronR。我同意 :-)。当然,我更喜欢tr解决方案,它已经是公认的答案。
ryenus 2014年

1
这在OS X上有效。为什么\n\r而不是\r\n?我尝试\r\n了Windows上的必要命令。但是,执行完此操作后,会在其中留下许多^M回车符vim,因此我认为应该只是,\n\n仅此一项是行不通的。
NobleUplift

4

尽管我迟到了这篇文章,但只是更新我的发现。此答案仅适用于Mac OSX。

$ 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中)


这与马克斯·纳纳西(Max Nanasy)两年前的回答没什么不同。
miken32 '16

2

只是要澄清一下:OSX(10.8; Darwin内核版本12.4.0)上sed的手册页说:

[...]

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"

注意:您必须输入< ctrl> -v,< return>才能在vi编辑器中获取'^ M'



1

sed在macOS Mojave上发布于2005年,因此一种解决方案是安装gnu-sed

brew install gnu-sed

然后使用gsed就会如您所愿

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

如果您愿意sedsudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew'可以推荐brew info gnu-sed。重新开始您的任期,然后sed在命令行中输入gsed


0

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

echo %path% | sed -e $'s/;/\\n/g' | less
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.