在字段中间(不是行尾)有一些带分隔符的换行符放置不当的文件,在Vim中显示为^ M。它们源自MSSQL数据库的freebcp(在Centos 6上)导出。以十六进制转储数据显示\ 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表达式(ctrl + v,ctrl + m)中使用^ M似乎也不起作用。
对于这种任务,sed更容易理解,但是我正在努力学习更多有关这两者的知识。我使用sed的方式不正确,还是有限制?
我相信的某些版本sed不会识别\r为字符。但是,您可以使用一项bash功能来解决该限制:
sed
\r
bash
echo $string | sed $'s/\r//'
在这里,您可以bash在将$'...'结构体中的实际回车符替换为\ r 之前,先将其传递给sed其命令。(假设您使用bash;其他shell应该具有类似的构造。)
$'...'