ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

试试 tr , '\n'。我猜,sed 将 \n 视为纯文本。
那行得通!猫文件 | tr , '\n'
tr , '\n' < file - 没有管道。
脚本末尾的 g 是做什么用的?没有它,我会得到相同的行为。
你用的是什么外壳?这对我有用,使用 bash shell。

P
Prince John Wesley

请改用 tr

tr , '\n' < file

它不是在 bash shell $ tr 中工作,'\n' aitr 用法: tr [-Ccsu] string1 string2 tr [-Ccu] -d string1 tr [-Ccu] -s string1 tr [-Ccu] -ds string1 string2
用分号替换逗号也可以:tr ',' ';' < input.csv > output.csv
m
miken32

使用 ANSI-C quoted string $'string'

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

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

注意 this will not work on all shells,但适用于最常见的。


奇怪的是,它也适用于少一个反斜杠,即 echo "a,b" | sed -e $'s/,/\\n/g
赞成。有关详细信息,请参阅 man bash 的“报价”部分。
可以在 OSX 10.11 上使用:sed -E $'s/<\\/br>/\\\n/g' file,无需安装 gnu-sed
通过给定的示例验证了在 OS X 10.7 上的工作。 -e 部分似乎没有必要。
这太棒了!将此与 fzf 一起用于调试我的 $PATH 以防丢失:echo $PATH | sed -e $'s/:/\\\n/g' | fzf ^.^
M
Max Nanasy
sed 's/,/\
/g'

适用于 Mac OS X。


谢谢你 - 想知道为什么我的旧 linux 技巧在 OSX 中不起作用。但这确实!
这是唯一适用于 sed 脚本的解决方案。
请注意,反斜杠转义了文字换行符(因此它不是命令终止符):它不是行继续符(如 bash 等)。要查看差异,请尝试编写不带引号的上述命令:反斜杠将被 shell 解释为换行符,并且它和换行符将被丢弃。相反,将带引号的表达式(不带引号)的内容包含在单独的 comma-to-newline.sed 文件中(这消除了 shell 语法),它就可以工作了!
这很好,因为它可以替换任何东西,而不是字符。 tr 似乎只适用于字符。如果将字符串作为第一个参数,它将替换所有出现的字符,而不是字符串。
@Droogans 您使用的是 bash、sh 还是其他 shell?你确定你使用的是单引号而不是双引号?
n
nar8789

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

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

F
Felix

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

首先,用\'$'\n''替换\n,它可以在MacOS下工作:sed 's/,/\'$'\n''/g'文件

第二种,只用一个空行:sed 's/,/\ /g' file

附言。注意用'分隔的范围

三、用gnu-sed替换mac-sed


C
Chris Seymour

显然 \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。
请记住,\r\n 不同,这可能会破坏进一步的数据操作和使用。
抱歉,这对我不起作用。我刚得到一个“r”,应该有一个换行符。
您应该在给出 \r 的答案中更清楚地说明!
它对我有用,但我想知道为什么! \n 是 unix stackoverflow.com/questions/1761051/difference-between-n-and-r 上的标准
J
Joel Purra

这适用于 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 你...


r
ryenus

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

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

这也适合混淆 C 竞赛,除了它是 Bash ;)
@亚伦R。我同意 :-)。当然,我更喜欢 tr 解决方案,这已经是公认的答案。
这在 OS X 上有效。为什么它是 \n\r 而不是 \r\n?我尝试了 \r\n,这是 Windows 上的必要顺序。但是,在我这样做之后,它会在 vim 中留下很多 ^M 回车字符,所以我认为它应该只有 \n 但单独的 \n 不起作用。
N
Nils von Barth

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


这与您两年前 Max Nanasy 的回答没有什么不同。
P
Paulo Henrique Lellis Gonalves
$ echo $PATH | sed -e $'s/:/\\\n/g' 
/usr/local/sbin
/Library/Oracle/instantclient_11_2/sdk
/usr/local/bin

...

在莫哈韦为我工作


t
t3az0r

只是为了澄清: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 编辑器中键入 -v, 才能获得 '^M'


D
DawnSong

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

brew install gnu-sed

然后使用 gsed 会如你所愿,

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

如果您更喜欢 sed,只需 brew info gnu-sed 建议的 sudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew'。重新启动您的术语,然后您在命令行中的 sedgsed


J
Jeff LaFay

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

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

s
shawon

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

find your_filename.txt -type f -exec sed -i 's/,/\n/g' {} \;