删除Unix中固定长度文件之间的换行符

删除Unix中固定长度文件之间的换行符

从主机获取固定长度文件的一个特定属性,我得到了垃圾字符,所以这个垃圾字符读取为换行符,结果整个数据被破坏。

文件中的数据示例

0401000000030020170628000000710000366400201706280002750035*T000100N▒101892928550383900000009201 00000000000008402017062800000020  0000006435000000000000000840A1E098D09D9279BE4000561510A00003220000000000000000000000FF

0401000000030020170628000000710000365400201706280001041125
T000100N▒101909856755446700000018201 00000000000008402017062800000000  00000067540000000000000008402ED730917E9D1DC040000B0810A04003240000000000000000000000FF

尽管我得到了垃圾字符,但第一条记录是正确的,*T000100N▒但对于第二条记录,T000100N▒垃圾字符被读取为新行字符。

答案1

在你的例子中sed成功:

sed '/^.\{216\}$/!N;s/./?/59' file

该地址/^.\{216\}$/!在不具有所需 216 个字符长度的行上执行下一个命令。在这种情况下,我们假设该行被分割,因此N读取该行的其余部分。

然后该s命令将该记录的第 59 个字符(*或换行符替换为问号(根据需要进行更改)。

这适用于您的示例,但我不确定其他一些随机字节或多字节字符是否会破坏脚本。

因此,如果sed在所有情况下都不起作用,请使用名为的好工具bbe它非常适合处理包括二进制数据在内的固定长度记录:

bbe -b ":219" -e 'r 58 ?' file

-b ":219"将块大小定义为 219(包括换行符和多字节字符),并r 58 ?用问号替换偏移量 58 处的字节(因此它是第 59 个字符)。

相关内容