有一些分隔符文件,在字段中间(而不是行末)存在不正确放置的换行符,出现为Vim中的^M。它们来自于Centos 6上的freebcp导出MSSQL数据库。将数据转储为十六进制显示\r\n模式:
$ xxd test.txt | grep 0d0a
0000190: 3932 3139 322d 3239 3836 0d0a 0d0a 7c43
我可以使用awk删除它们,但是用sed却做不到。
在awk中,这样做可以完全删除换行符:
awk 'gsub(/\r/,""){printf $0;next}{print}'
但是在sed中,它不能正常工作,会保留换行符:
sed -i 's/\r//g'
这似乎没有任何影响:
sed -i 's/\r\n//g'
即使在sed表达式中使用^M(ctrl+v,ctrl+m),也似乎无效。
对于这种任务来说,sed更容易理解,但我正在努力学习两者。 我是在错误地使用sed,还是存在一些限制?
sed -e s/"^M"//g
? - StevePOSIXLY_CORRECT=1
,也要执行sed 's/\r//g'
。第二个命令当然没有任何作用,因为\n
不是模式空间的一部分。 - ephemient