Решение Python с более гибкими аргументами командной строки:
#!/usr/bin/env python3
import sys, fileinput
def replace_after(haystack, needle, replacement):
pos = haystack.find(needle)
if pos >= 0:
pos += len(needle)
return haystack[:pos] + (replacement * (len(haystack) - pos))
else:
return haystack
if __name__ == '__main__':
needle, replacement = sys.argv[1:3]
del sys.argv[1:3]
with fileinput.input() as finput:
for line in finput:
print(replace_after(line.rstrip('\n'), needle, replacement))
Использование:
python3 unix.se.346510.py <NEEDLE> <REPLACEMENT> [FILES...]
Пример:
$ printf '%s\n' 'Word: foo' 'more Word: bar-baz' | python3 unix.se.346510.py 'Word: ' '*'
Word: ***
more Word: *******
Похоже на взаимодействие readline/терминала, начните с проверки переменных среды .inputrc
, /etc/inputrc
, /etc/default/login
, INPUTRC
во время процесса входа в систему, а затем привязок readline (черезbind -q backward-delete-char
).
Не повредит двойная проверка того, что находится в директивах client (ssh _config)SendEnv
и server (sshd _config AcceptEnv
), если что-то (хотя TERM
не отправляется от клиента к серверу таким образом в OpenSSH клиент всегда включает значение TERM
в настройку сеанса, а сервер устанавливает TERM
из этого ). Случайное присутствие TERMINFO
или TERMCAP
в окружающей среде — единственное, что я могу придумать, чтобы объяснить прерывистый характер этого.
Readline применяет "rubout" ко всему, что терминал объявляет своим "erase", а rubout - это то, что readline вызывает через backward-delete-char
.
TERM
— одна из специальных переменных, которые bash отслеживает, когда она установлена (независимо от того, изменяется ли)bash сбрасывает терминал:
/* What to do just after one of the TERMxxx variables has changed.
If we are an interactive shell, then try to reset the terminal
information in readline. */
void
sv_terminal (name)
char *name;
{
if (interactive_shell && no_line_editing == 0)
rl_reset_terminal (get_string_value ("TERM"));
}
(, где "TERMxxx
" означает TERM
, TERMCAP
и TERMINFO
), поэтому это объясняет, почему простая установка TERM
на его текущее значение фактически выполняет действие.
Если вы не можете отследить его, добавление «TERM=${TERM}
» в конце вашего .profile
/ .bashrc
может помочь -.
В крайнем случае вы также можете попробовать некоторые судебные меры, как подробно описано в моем ответе здесь.:Отслеживать и предупреждать пользователя при изменении настроек stty?