在Linux上删除Windows换行符(sed vs. awk)
在字段中间(不是行尾)有一些带分隔符的换行符放置不当的文件,在Vim中显示为^ M。它们源自MSSQL数据库的freebcp(在Centos
6上)导出。以十六进制转储数据显示\ r \ n模式:
$ xxd test.txt | grep 0d0a0000190: 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
功能来解决该限制:
echo $string | sed $'s/\r//'
在这里,您可以bash
在将$'...'
结构体中的实际回车符替换为\ r
之前,先将其传递给sed
其命令。(假设您使用bash
;其他shell应该具有类似的构造。)
以上是 在Linux上删除Windows换行符(sed vs. awk) 的全部内容, 来源链接: utcz.com/qa/431138.html