SED 命令给出回车符

SED 命令给出回车符

我对 SED 命令有疑问,我需要用字符串替换 @ 字符,并将字符串附加到 csv 文件中的某一列

所以

[email protected] 

会成为

[email protected]

我正在使用以下 sed 命令

sed -i .bak -E 's/([^,\n\“]*)@([^,\n\“]*)/\1_X_\[email protected]/' Test.csv

但是我在命令中的某处有一个新换行符,就像这样

foo_X_exxample.com
@newdomain.com

有人能告诉我 SED 命令的错误在哪里吗?

答案1

看来您的原始文件test.csv是 Windows 格式的,每个新行都有回车符(0x0d\r)和换行符(0x0a或)。您的搜索模式不排除,因此这将保留在第二个匹配的字段和输出中\nsed\r附加的文字。

所以你原来的命令:

sed -i .bak -E 's/([^,\n\“]*)@([^,\n\“]*)/\1_X_\[email protected]/' Test.csv

给出输出文件(使用od -c查看控制字符):

0000000   f   o   o   _   X   _   e   x   a   m   p   l   e   .   c   o
0000020   m  \r   @   n   e   w   d   o   m   a   i   n   .   c   o   m
0000040  \n

如果添加\r排除字符:

sed -i .bak -E 's/([^,\r\n\“]*)@([^,\r\n\“]*)/\1_X_\[email protected]/' Test.csv

然后保留原来的换行符序列:

0000000   f   o   o   _   X   _   e   x   a   m   p   l   e   .   c   o
0000020   m   @   n   e   w   d   o   m   a   i   n   .   c   o   m  \r
0000040  \n

请注意,您不需要在第一个匹配字段中使用\r或,因为这种形式的命令只会在单行内匹配,而不会通过换行符匹配。\nsed

相关内容