我必须删除日志文件中的大量换行符(十六进制 \x0a)。
我刚刚用 sed 解决了这个问题。我知道这有点复杂。
你知道怎样解决这个问题吗?
以下是示例文本文件: http://s000.tinyupload.com/index.php?file_id=05715208147126674999
hexdump -C hexprob.txt
00000000 45 0a 69 0a 6e 0a 66 0a 61 0a |Einfa|
我使用以下代码删除“E”:
sed -r 's/\x45//g' hexprob.txt | hexdump -C
00000000 0a 69 0a 6e 0a 66 0a 61 0a |.infa|
但如果我想删除“\x0a”,则不起作用:
sed -r 's/\x0a//g' hexprob.txt | hexdump -C
00000000 45 0a 69 0a 6e 0a 66 0a 61 0a |绝对|
你知道该怎么办吗?我只是不知道为什么我不能像其他十六进制值一样替换或删除它?
非常感谢!Fake4d
答案1
sed 实用程序是面向行的。读取一行并将其放入模式空间(模式空间不包含 \n)。sed 操作应用于模式空间,然后写出该行,并附加 \n。这就是它没有按预期执行的原因。
如果你想删除文件中的所有新行,那么你可以这样做
sed ':a;N;$!ba;s/\n//g' file
这实际上会循环读取文件行并将它们附加到模式空间,直到到达最后一行,然后对整个模式空间进行操作以删除 \n。
- :a 创建一个标签。
- N 将下一行读入模式空间
- $! 如果不是最后一行 ba 则分支到 a
- s//n//g 将所有 /g 出现的 \n 替换为空。
根据文件大小,这可能不起作用,因为模式空间的大小可能存在限制。通常,它更便于使用tr去做这个
tr -d '\n' <file