使用脚本时我遇到了这个问题,大多数时候当我运行脚本时,这是我得到的输出文件:
device_id,ip_address,serial_number
SEP0c1167231746, 148.000.000.32
SEP0c1167223fa5, 148.000.000.30
SEP0c1167224170, 148.000.000.30
SEP0c1167231d2e, 148.000.000.194
SEP0c1167233b9f, 148.000.000.31
CUV, 148.000.000.254
SEP0c1167231d32, 148.000.000.34
SEP501cbffcfa9c, 148.000.000.24
SEP00082fb67d5f, 148.000.000.21
SEP00082fb67701, 148.000.000.22
这正是我所期望的,但有时文件看起来像这样:
device_id,ip_address,serial_number
SEP0c1167231746
, 148.000.000.32
SEP0c1167223fa5
, 148.000.000.30
SEP0c1167224170
, 148.000.000.30
SEP0c1167231d2e
, 148.000.000.194
SEP0c1167233b9f
, 148.000.000.31
CUV
, 148.000.000.254
SEP0c1167231d32
, 148.000.000.34
SEP501cbffcfa9c
, 148.000.000.24
SEP00082fb67d5f
, 148.000.000.21
SEP00082fb67701
, 148.000.000.22
我试图弄清楚发生了什么,但它似乎不正常,现在我只想处理这个问题,使用 Ghex 我已经识别出导致问题的字符。
现在我想用 Null 替换所有“0D”并保留所有“0A”
作为一个注释,我尝试使用“dos2unix”,但它不起作用。
你可以帮帮我吗?
更新:使用: sed -n -e '/,/!{N;s/\n//;}; /,/p'输入
与这样的文件:
device_id,ip_address,serial_number
SEP0c1167231746
, 148.000.000.32
,
SEP0c1167223fa5
, 148.000.000.30
,
SEP0c1167224170
, 148.000.000.30
,
SEP0c1167231d2e
, 148.000.000.194
,
SEP0c1167233b9f
, 148.000.000.31
,
CUV
, 148.000.000.254
,
SEP0c1167231d32
, 148.000.000.34
,
SEP501cbffcfa9c
, 148.000.000.24
,
SEP00082fb67d5f
, 148.000.000.21
,
SEP00082fb67701
, 148.000.000.22
我有这个输出:
, 148.000.000.32
, 148.000.000.30
, 148.000.000.30
, 148.000.000.194
, 148.000.000.31
, 148.000.000.254
, 148.000.000.34
, 148.000.000.24
, 148.000.000.21
, 148.000.000.22
答案1
可能有更好的sed
选择,但这里有一个:
sed -n -e '/,/!{N;s/\n//;}; /,/p' input > output
它说,(默认情况下,不打印行):如果行中有逗号,则读取下一个换行并替换换行符。然后,如果该行中(现在或已经)有逗号,则打印该行。它从 读取input
并写入output
。对于某些 sed,您可以使用 sed 的-i
标志就地编辑文件。
输入示例:
device_id,ip_address,serial_number
SEP0c1167231746, 148.000.000.32
SEP0c1167223fa5, 148.000.000.30
SEP0c1167231746
, 148.000.000.32
SEP0c1167223fa5
, 148.000.000.30
示例输出:
device_id,ip_address,serial_number
SEP0c1167231746, 148.000.000.32
SEP0c1167223fa5, 148.000.000.30
SEP0c1167231746, 148.000.000.32
SEP0c1167223fa5, 148.000.000.30
答案2
查看您的十六进制转储,这似乎应该可以解决您的问题:
tr -d '\015' < input > log
因为八进制\015
是carriage return
^M
字符。
为什么dos2unix
没有帮助是因为查看您的案例中不存在的dos2unix
序列。\r\n