Unix sed查找模式,然后连接线

Unix sed查找模式,然后连接线,unix,sed,solaris,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 datada

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

当数据文件包含错误时,它看起来像这样

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
我知道真正的答案是修复底层数据,但目前这不是一个选项,我正在寻找解决办法

提前谢谢

这样就删除了dos字符,并用一个R替换它。这是一个很快想到的问题,mybe有更好的解决方案

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

ps:^M=Ctrl+M

 sed '/\r$/ { N; s/\r\n//; }' infile > outfile
注:这取决于
sed
了解控制字符。例如
\r
,它在Linux上工作-不确定Solaris;请注意,
^M
\r
(CR)的另一种表示形式

它的作用是:

  • 对于以
    \r
    结尾的行,命令
    N
    会将
    \N
    和下一行追加到当前行
  • 然后,
    s
    命令将结果
    \r\n
    序列替换为空字符串,从而有效地从两个连接行中删除该序列

首先使用
dos2unix
工具转换文件

dos2unix filename

sed -i filename 's/^M$/R//g'
这可能适用于您(GNU-sed):

如果要将空格转换为选项卡,请使用:

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

tr-d'\r'outFile
对您有帮助吗?祝您好运。感谢您的回复,但这并没有解决问题,带有^M的行上的数据已从上面的行中分离出来,因此我需要将这些数据向上移动,而不仅仅是在行中添加一个R。
 sed '/\r$/ { N; s/\r\n//; }' infile > outfile
dos2unix filename

sed -i filename 's/^M$/R//g'
sed ':a;$!N;s/\r\n//;ta;P;D' file
sed ':a;$!N;s/\r\n//;ta;s/  */\t/g;P;D' file