我有一个逗号分隔的字符串文件。我正在尝试用新行替换逗号。我试过了:
sed 's/,/\n/g' file
但它不工作。我错过了什么?
改用tr
:
tr , '\n' < file
使用ANSI-C 带引号的字符串 $'string'
您需要一个反斜杠转义的文字换行符才能进入 sed。至少在 bash 中,$''
字符串将替换\n
为真正的换行符,但是您必须将 sed 看到的反斜杠加倍以转义换行符,例如
echo "a,b" | sed -e $'s/,/\\\n/g'
请注意,这不适用于所有 shell,但适用于最常见的 shell。
sed 's/,/\
/g'
适用于 Mac OS X。
如果您的 sed 用法倾向于完全是替换表达式(就像我的倾向于那样),您也可以perl -pe
使用
$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz
MacOS不同,有两种方法可以在mac中用sed解决这个问题
首先,使用\'$'\n''
replace \n
,它可以在 MacOS 中工作:
sed 's/,/\'$'\n''/g' file
第二,只需使用一个空行:
sed 's/,/\
/g' file
附言。注意范围由 '
三、用gnu-sed替换mac-sed
显然\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
这适用于 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 你...
为了使它完整,这也有效:
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 中)
$ echo $PATH | sed -e $'s/:/\\\n/g'
/usr/local/sbin
/Library/Oracle/instantclient_11_2/sdk
/usr/local/bin
...
在莫哈韦为我工作
只是为了澄清:OSX(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 - 如上所述 - 或者 nifty
sed "s/,/^M
/g"
注意:您必须在 vi 编辑器中键入 < ctrl> -v,< return>才能获得 '^M'
sed
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
FWIW,以下行在 Windows 中工作,并用换行符替换我的路径变量中的分号。我正在使用安装在我的 git bin 目录下的工具。
echo %path% | sed -e $'s/;/\\n/g' | less
我发现了另一个也在工作的命令。
find your_filename.txt -type f -exec sed -i 's/,/\n/g' {} \;