Кто-то добавил reptyr в комментарии, а не в ответе, поэтому я не могу проголосовать за него, но он кажется хорошим ответом на отредактированный вопрос и отлично работал с CentOS.
см .: https://github.com/nelhage/reptyr https://www.ostechnix.com/reptyr-move-running-process-new-terminal/
Есть ли способ восстановить мои зависшие сеансы после повторного подключения?
РЕДАКТИРОВАТЬ: я выполняю некоторые обновления и установку с помощью yum и беспокоюсь , что это может быть проблемой, если процессы продолжают зависать посередине из того, что они делают.
То же самое, я потерял удаленное соединение с сеансом обновления yum. Я поискал и нашел этот вопрос ... затем снова подключился и использовал screen на этот раз:
и вот я нахожусь в восстановленном приглашении, которое yum выдавал несколькими часами ранее.
Технически все ответы верны, это НЕ восстановление зависшего сеанса, это переподготовка потерянного процесса к текущему сеансу. И очень полезно, это тоже ...
{ {1}}
С помощью sed
вы можете удалить строки, начинающиеся с #
(которым предшествует ноль или более пробелов), и удалить все строки, начинающиеся с #
, которые не не следует за одной обратной косой чертой (и только если она не находится между кавычками 1 ):
sed '/^[[:blank:]]*#/d
/["'\''].*#.*["'\'']/!{
s/\\\\#.*/\\\\/
s/\([^\]\)#.*/\1/
}' infile
1: это решение предполагает одну пару кавычек в строке
Эта команда должна работать.
sed -e '/^#/d;s/[^\/pting#.*$//' <путь-к-файлу>
Эта проблема сложнее, чем кажется, но не выходит за рамки возможностей regex. Проанализируем ее: Целая строка состоит из некомментированного текста, за которым может следовать комментированный текст. Что может появляться в некомментированном тексте:
\
, #
, '
, "
\
, за которым следует любой символ"
и может содержать.
\
или "
\
, за которым следует любой символ'
и может содержать
'
(Разница в обращении с двумя видами кавычек основана на том. unix shells - подстраивайте по вкусу)
Переводя это непосредственно в regex, вы хотите:
s/^([non comment])[comment]$/\1/
non comment = ([^\\"'#]|\\.|"([^\\"]|\\.)*"|'[^']*')*
(11111111|222|3(AAAAAA|BBB)33|4444444)*
comment = #.*
Therefore
s/^(([^\\"'#]|\\.|"([^\\"]|\\.)*"|'[^']*')*)#.*$/\1/
Для sed
regex, вам нужно больше обратных слешей, перед (
, |
, и )
символами:
s/^\(\([^\\"'#]\|\\.\|"\([^\\"]\|\\.\)*"\|'[^']*'\)*\)#.*$/\1/
А bash требует дополнительного цитирования:
sed 's/^\(\([^\\"'\''#]\|\\.\|"\([^\\"]\|\\.\)*"\|'\''[^'\'']*'\''\)*\)#.*$/\1/'
EDIT: Я не знал, что grep -o
существует, пока не увидел ответ @StéphaneChazelas. Тот же самый основной regex может быть адаптирован к этому подходу, а egrep позволяет вам не делать большинство дополнительных обратных слешей:
grep -Eo '^([^\\"'\''#]|\\.|"([^\\"]|\\.)*"|'\''[^'\'']*'\'')*'
grep -Eo "^([^\\\\\"'#]|\\\\.|\"([^\\\\\"]|\\\\.)*\"|'[^']*')*"
Оба они идентичны по смыслу (и, к счастью, одинаковой длины), это просто разные подходы к цитированию в shell - лично я предпочитаю первый подход, потому что одинарная кавычка - единственный символ, о котором мне нужно беспокоиться, но вы можете найти второй более читабельным, и он очень похож на то, что вы бы написали в других языках программирования.
Одна оговорка заключается в том, что регекс не знает, что делать со строками, которые содержат несовпадающие кавычки. Они вообще не будут соответствовать regex, поэтому команда sed ничего не удалит, в то время как команда grep удалит все.