Como el subcomando GNUsed
a text
opera 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
cmd | sed -e 's/.*\r//' > file
Это заменит весь текст в каждой строке, за которой следует возврат каретки, ничем, оставив только часть строки после последнего возврата каретки. Однако это не обязательно то же самое, что осталось бы на терминале, но в большинстве случаев это близкое приближение.
В частности, случай, когда строка длиннее, чем ее потомок, не обрабатывается. Эта программа дала бы неправильные результаты:
printf 'abcdefg\rxyz\n'
printf '123456789\r\nxyz\n'
потому что то, что явно осталось бы
xyzdefg
123456789
xyz
, но sed
также пропустит все нестертые символы и выдаст
xyz
xyz
Вы можете определить, будет ли ваша программа вести себя так или нет. Нередко индикаторы выполнения и тому подобное останавливают курсор на левом -краю руки, что может не дать желаемого результата.
Что-то близкое к перезаписывающему поведению можно сделать с помощью 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
для этой записи.
Для очень примитивного вывода 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 %