sed找到模式然后连接线

时间:2014-02-27 12:40:04

标签: unix sed solaris

我正在寻找一些关于我一直看到的数据文件问题的帮助

数据文件包含错误

时看起来像这样
H Data  data    data
R data  datadata    datadatadata^M
  data  data    ^M
datadata
R data  datadata    datadatadata    data    data    datadata
R data  datadata    datadatadata    ^M
data    data    datadata
R data  datadata    datadatadata    data    data    datadata
T data  data    data    data

我需要删除^ M个字符并将以下行连接到数据文件中,并且每行都应以H,R或T开头。

H Data  data    data
R data  datadata    datadatadata    data    data    datadata
R data  datadata    datadatadata    data    data    datadata
R data  datadata    datadatadata    data    data    datadata
R data  datadata    datadatadata    data    data    datadata
T data  data    data    data

我知道真正的答案是修复基础数据,但这不是一个选项,我正在寻找解决方法。

提前致谢

5 个答案:

答案 0 :(得分:0)

sed -i your file 's/^M$/R//g'

sed 's/^M$/R//g' oldfile >newfile ; mv newfile oldfile

这样就删除了dos字符并用一个R替换它。这是一个快速思考mybe,它有一个更好的解决方案。

答案 1 :(得分:0)

sed 's/\n^M//g' YourFile

sed 's/[[:cntrl:]]//g' YourFile

ps:^ M = Ctrl + M

答案 2 :(得分:0)

 sed '/\r$/ { N; s/\r\n//; }' infile > outfile

注意:这取决于sed理解控制字符。例如\r,适用于Linux - 不确定Solaris;请注意^M\r(CR)的另一种表示形式。

它的作用:

  • 对于以\r结尾的行,命令N会将\n next 行附加到当前行。
  • 然后s命令通过将其替换为空字符串,有效地从两个连接的行中删除生成的\r\n序列。

答案 3 :(得分:0)

首先使用dos2unix工具转换文件

dos2unix filename

sed -i filename 's/^M$/R//g'

答案 4 :(得分:0)

这可能适合你(GNU sed):

sed ':a;$!N;s/\r\n//;ta;P;D' file

如果要将空格转换为制表符,请使用:

sed ':a;$!N;s/\r\n//;ta;s/  */\t/g;P;D' file