Подтвердить что ты не робот

Как СООБЩИТЬ строку, которая содержит определенную строку, используя Sed?

Строки в файле:

-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

что не работает.

4b9b3361

Ответ 1

Попробуйте выполнить эту команду sed,

sed -i '/^#.* 2001 /s/^#//' file

Ответ 2

Да, чтобы прокомментировать строку, содержащую определенную строку с 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" в конце означает глобальное изменение. Если вы хотите изменить только один экземпляр шаблона, просто пропустите это.

Ответ 3

Чтобы дополнить @полезный ответ @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.
  • Пробел после комментария char сохраняется, но не раньше него.
  • При добавлении комментария char к строке он непосредственно добавляется без пробелов.
  • Таким образом, если вы только переключаете комментарии с этим решением, все пробелы сохраняются.
  • POSIX awk не предлагает обновление на месте (также не POSIX sed, кстати), поэтому вывод сначала фиксируется во временном файле, и этот файл затем заменяет оригинал на успех.

Ответ 4

Для Mac, который не поддерживает стандартные параметры sed, это уберет хэштег

sed -i "" "/.*#.*d\/docker-php-ext-xdebug\.ini.*/s/^#//g" docker-compose.yml

Ответ 5

Быстрый пример того, как комментировать и раскомментировать строку в файле.

Пример файла:

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