Назад | Перейти на главную страницу

Замена LineFeed \ x0a на SED

Мне нужно удалить много переводов строки (Hex \ x0a) в файле журнала.

Я просто решил решить проблему. Я знаю, это немного сложно ...

Вы знаете, как решить проблему?

Вот пример текстового файла: http://s000.tinyupload.com/index.php?file_id=05715208147126674999

hexdump -C hexprob.txt
00000000 45 0a 69 0a 6e 0a 66 0a 61 0a | E.i.n.f.a. |

Я использую следующий код, чтобы удалить букву «E»:

sed -r 's / \ x45 // g' hexprob.txt | hexdump -C

00000000 0a 69 0a 6e 0a 66 0a 61 0a | .i.n.f.a. |

Но если я хочу удалить '\ x0a', это не сработает:

sed -r 's / \ x0a // g' hexprob.txt | hexdump -C

00000000 45 0a 69 0a 6e 0a 66 0a 61 0a | E.i.n.f.a. |

Ты знаешь что делать? Я просто не знаю, почему я не могу заменить или удалить его так же, как любое другое шестнадцатеричное значение?

Спасибо вам большое! Fake4d

Утилита sed ориентирована на строки. Строка считывается и помещается в пространство шаблонов (пространство шаблонов не содержит \ n). Действия sed применяются к пространству шаблонов, и затем строка записывается с добавлением \ n. Вот почему он не делает того, чего вы ожидаете.

Если вы хотите удалить все новые строки в файле, вы можете сделать это

sed ':a;N;$!ba;s/\n//g' file

Это эффективно перебирает строки чтения файла и добавляет их в пространство шаблонов до тех пор, пока не будет достигнута последняя строка, когда все пространство шаблонов будет удалено для удаления \ n.

  • : a создает метку.
  • N читает следующую строку в пробел
  • $! если не последняя строка ba, переход к
  • s // n // g заменяет все / g вхождений \ n ничем.

В зависимости от размера вашего файла это может не сработать, поскольку могут быть ограничения на размер пространства шаблонов. Как правило, более портативный в использовании tr сделать это

tr -d '\n' <file