Удалить из строк '^ [[', за которым следует заглавная буква с помощью sed [duplicate]

  1. Всегда пытайтесь отправлять заголовки в почтовую функцию.
  2. Если вы отправляете почту через localhost, тогда выполните настройки smtp для отправки почты.
  3. Если вы отправляете почту через затем проверьте, включена ли функция отправки электронной почты на вашем сервере.
5
задан Chris Martin 3 April 2016 в 11:20
поделиться

2 ответа

Чтобы отобразить файл, содержащий ANSI-последовательности,

less -r typescript

Или,

less -R typescript

Чтобы удалить последовательности ANSI и обратного пространства из файла, создайте чистый newfile , try:

sed -r ':again; s/[^\x08]\x08\x1b\[K//; t again; s/\x1b_[^\x1b]*\x1b[\]//g; s/\x1B\[[^m]*m//g' typescript >newfile

Как это работает

  • -r Это включает расширенные регулярные выражения. (В системах BSD -r следует заменить на -E. Современные версии GNU sed будут принимать либо -r, либо -E.)
  • `: again; s / [^ \ x08] \ x08 \ X1B [K //; t again Это удаляет любые обратные последовательности. Они выполняются по одному в цикле.
  • s/\x1b_[^\x1b]*\x1b[\]//g Как расширение xterm (см. documentation ), Esc _ something Esc \ ничего не сделает. Эта команда удаляет эти последовательности.
  • s/\x1B\[[^m]*m//g Это удаляет оставшиеся последовательности ANSI, которые задают цвета и т. Д.

Это охватывает все последовательности управления, которые я обычно запускаю , Существует множество расширенных управляющих последовательностей, и если на вашем выходе есть некоторые из них, которые я еще не видел, возможно, потребуется расширить код.

POSIX или BSD sed

В системе BSD или POSIX отдельные команды должны быть соединены вместе с параметрами -e вместо точек с запятой. Таким образом, попробуйте:

sed -e ':again' -e 's/[^\x08]\x08\x1b\[K//' -e 't again' -e 's/\x1b_[^\x1b]*\x1b[\]//g' -e 's/\x1B\[[^m]*m//g'
3
ответ дан John1024 20 August 2018 в 15:36
поделиться

Предлагаемый ответ с использованием «sed -r» зависит от GNU sed, что делает его не очень портативным. Можно выполнять те же функции с POSIX sed, но по-разному: POSIX не предусматривает передачу всего скрипта в командной опции, как показано здесь. Это означает, что способ (POSIX) для реализации цикла будет находиться в отдельном файле, переданном sed с использованием опции «-f». Аналогично, шестнадцатеричные константы не переносимы. После внесения этих изменений функциональный эквивалентный сценарий может быть использован в системах BSD и Unix.

В предлагаемом ответе также не рассматриваются некоторые виды использования возвратов каретки, которые довольно распространены (например, в выходном файле yum ), и не отфильтровывает «большинство» ANSI-последовательностей (поскольку в нем основное внимание уделяется окончательному символу SGR «m»). Наконец, это означает

escape _ text _

как расширение xterm. Но такое расширение не обеспечивается xterm, потому что два символа «escape» и «_» начинают последовательность Application Program Command (и xterm не реализует ни одного).

Полученное sed -script выглядит так: «[^] - символ escape-кода):

s/^[[[][<=>?]\{0,1\}[;0-9]*[@-~]//g
s/^[[]][^^[]*^G//g
s/^[[]][^^[]*^[\\//g
:loop
s/[^^H]^H\(.\)/\1/g
t loop
s/^M^M*$//g
s/^.*^M//g
s/^[[^[]//g

Здесь можно найти более полный скрипт с именем« script2log » здесь . Есть, однако, вещи (такие как CSI K), которые не подходят для сценария sed.

2
ответ дан Thomas Dickey 20 August 2018 в 15:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: