325

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

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

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

4

14 回答 14

395

改用tr

tr , '\n' < file
于 2012-05-25T16:27:21.367 回答
338

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

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

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

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

于 2013-08-23T19:06:11.317 回答
132
sed 's/,/\
/g'

适用于 Mac OS X。

于 2012-09-07T20:24:55.280 回答
25

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

$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz
于 2014-04-15T23:23:40.443 回答
18

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

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

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

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

  • 三、用gnu-sed替换mac-sed

于 2018-03-13T09:32:19.813 回答
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
于 2013-08-10T17:51:41.993 回答
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 你...

于 2014-01-13T21:09:19.067 回答
7

为了使它完整,这也有效:

echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
于 2013-07-17T11:35:28.973 回答
4

虽然我迟到了这篇文章,但只是更新了我的发现。此答案仅适用于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 中)

于 2014-06-17T23:31:16.053 回答
3
$ echo $PATH | sed -e $'s/:/\\\n/g' 
/usr/local/sbin
/Library/Oracle/instantclient_11_2/sdk
/usr/local/bin

...

在莫哈韦为我工作

于 2019-04-26T14:01:39.657 回答
2

只是为了澄清:OSX(10.8;达尔文内核版本 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 - 如上所述 - 或者 nifty

sed "s/,/^M
/g"

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

于 2013-08-20T08:12:43.380 回答
2

sedmacOS 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-sedsedgsed

于 2019-05-24T07:11:59.473 回答
0

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

echo %path% | sed -e $'s/;/\\n/g' | less
于 2014-10-30T15:36:32.413 回答
0

我发现了另一个也在工作的命令。

find your_filename.txt -type f -exec sed -i 's/,/\n/g' {} \;
于 2022-02-25T09:39:20.380 回答