我有一个以逗号分隔的id文件。我正在尝试用新行替换逗号。我试过了:
sed 's/,/\n/g' file
但它不起作用。我错过了什么?
答案 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
。
答案 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)说:
[...]
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
建议的。重新开始您的任期,然后您在命令行中的sed
是gsed
。
答案 13 :(得分:-2)
我们也可以在sed中这样做。
你可以试试这个,
sed -i~bak 's/\,/\n/g' file
-i - 将更改文件中的修改。请小心使用此选项。
我希望这会对你有所帮助。