Комментирование строк между двумя тегами в оболочке

альтернатива lmsensor:

установить xsensors с помощьюsudo apt-get install xsensors

0
03.03.2020, 08:29
3 ответа

Попробуйте это,

Имейте в скрипте следующее, чтобы прокомментировать или раскомментировать модуль

 if [ "$2" == uncomment ]; then
    sed -i "/<IfModule $1>/,/<\/IfModule>/ s/^#//" apache.conf
 elif [ "$2" == comment ]; then
    sed -i "/<IfModule $1>/,/<\/IfModule>/ s/^\(<\| \)/#\1/" apache.conf
 fi

Синтаксис для запуска скрипта:

sh script.sh <moduleName> <comment/uncomment>

Пример:

sh script.sh mod_disk_cache.c uncomment
2
28.04.2021, 23:21

Вы можете сделать это с помощью простого конечного автомата в awk. Для простоты предположим, что mod.xmlсодержит:

#stuff
#
#<IfModule mod_disk_cache.c>
# CacheRoot "/var/cache/mod_proxy"
# CacheEnable disk
# CacheEnable disk
# CacheEnable disk
# CacheIgnoreCacheControl On
# CacheDirLevels 1
#</IfModule>
#
#other stuff

Затем,

$ cat mod.xml | awk -F'#' 'BEGIN { state = 0; } { if (/mod_disk_cache/) state = !state; if (state) print $2; else print $0; if (/\/IfModule/) state = !state; }' > umod.xml
$ cat umod.xml
#stuff
#
<IfModule mod_disk_cache.c>
 CacheRoot "/var/cache/mod_proxy"
 CacheEnable disk
 CacheEnable disk
 CacheEnable disk
 CacheIgnoreCacheControl On
 CacheDirLevels 1
</IfModule>
#
#other stuff

Переменная stateзаписывает, когда мы находимся внутри(state == 0)или снаружи(state != 0)блока, который хотим прокомментировать/раскомментировать.

Примечание.:Здесь важно, чтобы приведенный выше блок не содержал подблоков -, заканчивающихся на </IfModule>, потому что это приведет к преждевременному сбросу состояния. Если вам нужно поддержать это дело, то государство должно захватить больше. Например, рассмотрите возможность сделать состояние целым числом, которое равно -1, когда вы находитесь за пределами целевого блока, устанавливается в 0, когда вы входите в целевой блок, и увеличивается, когда вы входите в подблок -.

Эта команда обрабатывает ваш исходный ввод, где блок mod_cache.cимеет вложенный подблок -:

$ cat mod.xml | awk -F# 'BEGIN { state = -1; } { if (/<IfModule mod_cache\.c>/) state = 0; else if (/<IfModule.*>/) state++; if (state >= 0) print $2; else print $0; if (/<\/IfModule/) state--;}'

Вернемся к простому примеру, чтобы -прокомментировать, вы можете сделать что-то подобное, просто установите разделитель полей вывода (OFS )и распечатайте #перед каждой строкой, когда stateоценивается как правда:

$ cat umod.xml | awk -F'#' 'BEGIN { OFS=""; state = 0; } { if (/mod_disk_cache/) state = !state; if (state) print "#", $0; else print $0; if (/\/IfModule/) state = !state; }'
#stuff
#
#<IfModule mod_disk_cache.c>
# CacheRoot "/var/cache/mod_proxy"
# CacheEnable disk
# CacheEnable disk
# CacheEnable disk
# CacheIgnoreCacheControl On
# CacheDirLevels 1
#</IfModule>
#
#other stuff
0
28.04.2021, 23:21

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

awk '/#.*IfModule mod_cache.c/,/#.*IfModule mod_expires.c/{gsub("#","",$0)}1'  filename

Комментировать

awk '/^<IfModule mod_cache.c/,/^<IfModule mod_expires.c/{$0="#"$0}1'  filename
0
28.04.2021, 23:21

Теги

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