Ответ 1
Попробуйте выполнить эту команду sed
,
sed -i '/^#.* 2001 /s/^#//' file
Строки в файле:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2000 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2001 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2002 -j ACCEPT
чтобы прокомментировать, пусть строка, содержащая
2001
Я могу просто запустить эту команду SED:
sed -i '/ 2001 /s/^/#/' file
но теперь как я вернусь назад?
как при раскомстировании той же строки?
Я попробовал
sed -i '/ 2001 /s/^//' file
что не работает.
Попробуйте выполнить эту команду sed
,
sed -i '/^#.* 2001 /s/^#//' file
Да, чтобы прокомментировать строку, содержащую определенную строку с sed, просто выполните:
sed -i '/<pattern>/s/^/#/g' file
И раскомментировать его:
sed -i '/<pattern>/s/^#//g' file
В вашем случае:
sed -i '/2001/s/^/#/g' file (to comment out)
sed -i '/2001/s/^#//g' file (to uncomment)
Опция "g" в конце означает глобальное изменение. Если вы хотите изменить только один экземпляр шаблона, просто пропустите это.
Чтобы дополнить @полезный ответ @Avinash Raj с более общим, POSIX-совместимым решением.
Обратите внимание, что решение awk
основано, поскольку надежное портативное решение с sed
практически невозможно из-за ограничений основных регулярных выражений POSIX.
awk -v commentId='#' -v word='2001' '
$0 ~ "(^|[[:punct:][:space:]])" word "($|[[:punct:][:space:]])" {
if (match($0, "^[[:space:]]*" commentId))
$0 = substr($0, RSTART + RLENGTH)
else
$0 = commentId $0
}
{ print }
' file > tmpfile.$$ && mv tmpfile.$$ file
(^|[[:punct:][:space:]])
и ($|[[:punct:][:space:]])
являются расширенными регулярными выражениями POSIX в выражениях \<
и \>
словесных границ, известных из других диалектов regex.awk
не предлагает обновление на месте (также не POSIX sed
, кстати), поэтому вывод сначала фиксируется во временном файле, и этот файл затем заменяет оригинал на успех.Для Mac, который не поддерживает стандартные параметры sed, это уберет хэштег
sed -i "" "/.*#.*d\/docker-php-ext-xdebug\.ini.*/s/^#//g" docker-compose.yml
Быстрый пример того, как комментировать и раскомментировать строку в файле.
Пример файла:
umask 027
TMOUT=600
Теперь давайте сделаем резервную копию файла (только для смеха), закомментируем и откомментируем:
# backup file (because we should always do this)
cp /etc/bash.bashrc /etc/bash.bashrc.$(date '+%Y-%m-%d,%H:%M:%S')
# original: TMOUT=600 , result :# TMOUT=600
sed -i '/[^#]/ s/\(^TMOUT=600.*$\)/#\ \1/' /etc/bash.bashrc
# original # TMOUT=600 ,result :TMOUT=600
sed -i '/^#.*TMOUT=600.*$/s/^#\ //' /etc/bash.bashrc