Как удалить все комментарии из файла с сохранением экранированных хэш-символов

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

см .: https://github.com/nelhage/reptyr https://www.ostechnix.com/reptyr-move-running-process-new-terminal/

Есть ли способ восстановить мои зависшие сеансы после повторного подключения?

РЕДАКТИРОВАТЬ: я выполняю некоторые обновления и установку с помощью yum и беспокоюсь , что это может быть проблемой, если процессы продолжают зависать посередине из того, что они делают.

То же самое, я потерял удаленное соединение с сеансом обновления yum. Я поискал и нашел этот вопрос ... затем снова подключился и использовал screen на этот раз:

  1. переподключить ssh
  2. экран
  3. установить reptyr по ссылкам выше
  4. ps -a | grep yum
  5. reptyr psid

и вот я нахожусь в восстановленном приглашении, которое yum выдавал несколькими часами ранее.

Технически все ответы верны, это НЕ восстановление зависшего сеанса, это переподготовка потерянного процесса к текущему сеансу. И очень полезно, это тоже ...

{ {1}}

6
06.05.2016, 19:49
3 ответа

С помощью sed вы можете удалить строки, начинающиеся с # (которым предшествует ноль или более пробелов), и удалить все строки, начинающиеся с # , которые не не следует за одной обратной косой чертой (и только если она не находится между кавычками 1 ):

sed '/^[[:blank:]]*#/d
/["'\''].*#.*["'\'']/!{
s/\\\\#.*/\\\\/
s/\([^\]\)#.*/\1/
}' infile

1: это решение предполагает одну пару кавычек в строке

5
27.01.2020, 20:27

Эта команда должна работать.

sed -e '/^#/d;s/[^\/pting#.*$//' <путь-к-файлу>

0
27.01.2020, 20:27

Эта проблема сложнее, чем кажется, но не выходит за рамки возможностей regex. Проанализируем ее: Целая строка состоит из некомментированного текста, за которым может следовать комментированный текст. Что может появляться в некомментированном тексте:

  1. Любой символ, кроме \, #, ', "
  2. \, за которым следует любой символ
  3. Строка в кавычках, которая начинается и заканчивается " и может содержать.
    • A) любой символ, отличный от \ или "
    • B) \, за которым следует любой символ
  4. Строка в кавычках, которая начинается и заканчивается ' и может содержать
    • любой символ, кроме '

(Разница в обращении с двумя видами кавычек основана на том. 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 удалит все.

2
27.01.2020, 20:27

Теги

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