我对 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
或)。您的搜索模式不排除,因此这将保留在第二个匹配的字段和输出中\n
sed
\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
或,因为这种形式的命令只会在单行内匹配,而不会通过换行符匹配。\n
sed