从文件的每一行中删除第一个 ^M

gat*_*ack 2 text-processing

数据从第二行开始。 是否有一个简单的脚本或实用程序来删除每行数据的第一个实例^m

该问题也可以重新表述为:如何^m删除每秒(甚至)实例?期待有趣(聪明)的回应。最好在 Ubuntu 或类似版本中。

在此处输入图片说明

用于巧妙剪切、粘贴和解析的原始数据:

Date,From,To,Flight_Number,Airline,Distance,Duration,Seat,Seat_Type,Class,Reason,Plane,Registration,Trip,Note,From_OID,To_OID,Airline_OID,Plane_OID^M
- -,JFK,OTBD,American Airlines (AA),American Airlines,6687,13:52,,,,,777^M,,,"Direct",3797,2241,24^M
- -,JFK,OTBD,Qatar Airways (QR),Qatar Airways,6687,13:52,,,,,77W^M,,,"Direct",3797,2241,4091^M
Run Code Online (Sandbox Code Playgroud)

话虽如此,提出这个问题的原因是意外的 ^m 导致了 Libre-Office Calc(电子表格)的导入问题:它导致了预期的换行。

在此处输入图片说明

Ste*_*ris 8

假设您想将文件保留为 DOS 格式(CRLF 行尾),我们可以作弊;删除所有CR,然后将它们添加回行尾。

所以

tr -d '\015' < srcfile | unix2dos > newfile
Run Code Online (Sandbox Code Playgroud)

编辑详细说明:

tr -d '\015'
Run Code Online (Sandbox Code Playgroud)

将从文件中删除所有control-M 字符。 -dtotr表示“删除”,'\015'是八进制格式的 control-M 字符。

unix2dos
Run Code Online (Sandbox Code Playgroud)

通过在 LF 字符之前插入 CR (control-M) 将任何 LF (linefeed; control-J; ) 字符转换为 CRLF; 这会将 unix 格式的文本文件转换为 DOS 格式的文本文件。

将两者放在一起,我们删除所有流氓 ^M 并确保唯一一个位于每行的末尾。