как я могу прокомментировать / в разделе в исходном коде с sed или awk

В настоящее время у меня есть файлы, содержащие такие разделы

code statement1 code statement2 # BEGIN SOMENAME some code some other code # END SOMENAME code statement n +1 code statement n +1 

Я хочу сделать это, чтобы прокомментировать, что находится между «# BEGIN SOMENAME» и «# END», так что в конце это выглядит так

 code statement1 code statement2 # BEGIN SOMENAME # some code # some other code # END SOMENAME code statement n +1 code statement n +1 

Могу ли я достичь этого с помощью awk или sed? и я могу легко его перевернуть ?, так что просто операция, которая снова «комментирует»?

Я хочу избежать ошибок, поэтому, если строки уже прокомментированы, их следует оставить в покое. Также в «комментарии в» он не должен пытаться что-то сделать, если строки между концом и началом не начинаются с «#».

Пробовал это сейчас несколько часов, никакого успеха.

Нашел возможный раствор:

 awk ' BEGIN { i=0; line_with_no_comment_found=0 } /^# END/ { m=0; if ( line_with_no_comment_found == 1 ) { for (var in a) print "# "a[var] } else { for (var in a) print a[var] } delete a; i=0; line_with_no_comment_found=0; } /^# / { if (m==0) { print } else { a[i++]=$0; } } !/^# / { if (m==0) { print } else { a[i++]=$0; line_with_no_comment_found=1} } /^# BEGIN ([a-zA-Z_])([1-9][0-9]*)*/ {m=1;} END { } '<<EOF 

One Solution collect form web for “как я могу прокомментировать / в разделе в исходном коде с sed или awk”

Этот скрипт работает для меня. Я тестировал его в GNU Awk 4.0.1, но должен работать и в Nawk.

 awk 'BEGIN { # action=0: uncomment # action=1: comment action=0 in_optional_code_block=0 } { if ($0 ~ /^# BEGIN/) { in_optional_code_block=1 } else if ($0 ~ /^# END/) { in_optional_code_block=0 } else if (in_optional_code_block) { if (action) { if ($0 !~ /^#/) { $0 = "# " $0 } } else { if ($0 ~ /^#/) { sub(/^# ?/, "") } } } } 1' 

Я также написал небольшой сопроводительный сценарий оболочки:

 #!/usr/bin/env sh syntax_error() { echo "Usage: `basename \"$0\"` [comment|uncomment] file" >&2 exit 1 } case "$1" in 0|uncomment) action=0; ;; 1|comment) action=1; ;; *) syntax_error; ;; esac shift if [ -z "$@" ]; then syntax_error; fi awk 'BEGIN { action='$action' in_optional_code_block=0 } { if ($0 ~ /^# BEGIN/) { in_optional_code_block=1 } else if ($0 ~ /^# END/) { in_optional_code_block=0 } else if (in_optional_code_block) { if (action) { if ($0 !~ /^#/) { $0 = "# " $0 } } else { if ($0 ~ /^#/) { sub(/^# ?/, "") } } } } 1' "$@" > ".$@.commentswap" if [ $? -eq 0 ]; then mv ".$@.commentswap" "$@"; fi 

(Если у вас есть GNU Awk 4.1.0 или новее, вы можете использовать флаг -i вместо конструкции перемещения в конце.)

  • Linux + захватывает только IP из команды mount
  • Как выполнить многострочный grep
  • Замените строку «string | string»
  • Как просмотреть файлы, содержащие пробелы в имени файла?
  • Повторяйте каждую строку несколько раз
  • sed или grep, чтобы получить только значения без цифр
  • Файлы Cat 2 и избегайте дублирования строк
  • sed: чтение всего файла в пространство шаблонов без сбоев при однострочном вводе
  • Как использовать awk или sed для преобразования строк в столбцы
  • Ошибка Sed, заменяющая частичную строку переменной
  • обратные ссылки в regex `rename`
  • команда bash, которая выводит результат предыдущего канала
  • Interesting Posts

    Контроллер Logitech не переходит в виртуальную машину Centos как джойстик

    fstab автомонтированное устройство не автоматически размонтируется

    Клавиши со стрелками в `less`

    Как группы взаимодействуют с неклассифицированными процессами?

    Конфигурация сети в Linux

    Как настроить Alpine для подключения моей учетной записи Gmail с помощью IMAP?

    Как правильно использовать pgrep внутри bash?

    Заменить все вхождения символа, кроме первого

    Каков самый маленький дистрибутив Linux по размеру установки?

    Почему изменение $ PATH влияет на дочерние оболочки, но с изменением $ foo нет?

    Что происходит, когда я копирую файл из одного сетевого местоположения в другое

    Не удается получить каталог с папкой, в которой у меня есть разрешения для

    Как создать настроенный дистрибутив на основе Debian?

    pkgProblemResolver :: Разрешить сгенерированные перерывы

    Права пользователя на установленном USB-Stick

    Linux и Unix - лучшая ОС в мире.