Перенаправление вывода, который спамит терминал с возвратом каретки

Como el subcomando GNUseda textopera un texto para agregar que se lee hasta el final de la línea, puede aplicar el siguiente truco (imitando un salto de línea):

sed '/\[httpd\]/a secure_rewrites = false;
/\[couchdb\]/adelayed_commits = false' local.ini

Muestra de salida:

...
[httpd]
secure_rewrites = false;
...
[couchdb]
delayed_commits = false
2
01.06.2019, 04:59
3 ответа
cmd | sed -e 's/.*\r//' > file

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


В частности, случай, когда строка длиннее, чем ее потомок, не обрабатывается. Эта программа дала бы неправильные результаты:

printf 'abcdefg\rxyz\n'
printf '123456789\r\nxyz\n'

потому что то, что явно осталось бы

xyzdefg
123456789
xyz

, но sedтакже пропустит все нестертые символы и выдаст

xyz

xyz

Вы можете определить, будет ли ваша программа вести себя так или нет. Нередко индикаторы выполнения и тому подобное останавливают курсор на левом -краю руки, что может не дать желаемого результата.

4
27.01.2020, 21:53

Что-то близкое к перезаписывающему поведению можно сделать с помощью GNU awk:

BEGIN { 
  RS = "[\r\n]"                   # split records on either CR or LF
  a = ""                          # variable to save the text for overwriting
} 
{
  a = $0 substr(a, 1 + length)    # save current line, add trailing part of saved text
} 
RT ~ /\n/ {                       # LF, time to print and reset
  print a;
  a = ""
}

На примере Майкла Гомера:

~ awk 'BEGIN { RS="[\r\n]" } {a = $0 substr(a, 1 + length)} RT ~ /\n/ {print a; a=""}' foo
xyzdefg
123456789
xyz

GNU awk требуется для переменной RT, которая содержит текст разделителя записей, соответствующий регулярному выражению RSдля этой записи.

0
27.01.2020, 21:53

Для очень примитивного вывода TTY -37 команда colрешает эту проблему без проблем sed, упомянутых в ответе М. Гомера. (Для вывода, который не является простым выводом TTY -37 и содержит терминальные escape-последовательности и управляющие последовательности, ни col, ни sedне подходят для этой работы; но у Stack Exchange есть вопросы и ответы по , уже почти восемь лет.)

% (
printf 'abcdefg\rxyz\n'
printf '123456789\r\nxyz\n'
) | col -b
xyzdefg
123456789
xyz
%
3
27.01.2020, 21:53

Теги

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