用 SED 替换换行符 \x0a

用 SED 替换换行符 \x0a

我必须删除日志文件中的大量换行符(十六进制 \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  

相关内容