一尘不染

在Linux上删除Windows换行符(sed vs. awk)

linux

在字段中间(不是行尾)有一些带分隔符的换行符放置不当的文件,在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的方式不正确,还是有限制?


阅读 992

收藏
2020-06-03

共1个答案

一尘不染

我相信的某些版本sed不会识别\r为字符。但是,您可以使用一项bash功能来解决该限制:

echo $string | sed $'s/\r//'

在这里,您可以bash在将$'...'结构体中的实际回车符替换为\ r
之前,先将其传递给sed其命令。(假设您使用bash;其他shell应该具有类似的构造。)

2020-06-03