Как прокомментировать строку на основе слова, с которого оно начинается?

пример содержимого файла:

-------------------- NETWORKING=yes HOSTNAME=wls1.ebs-testsrvrs.com # oracle-rdbms-server-12cR1-preinstall : Add NOZEROCONF=yes NOZEROCONF=yes -------------------- 

Я хочу прокомментировать все строки, начинающиеся с «HOST»

  • Как (и нужно ли) копировать и вставлять на веб-интерфейс ssh?
  • Позиция курсора в vi при открытии файла
  • Есть ли у традиционных vi (not vim) поддержка больших файлов?
  • Загрузка внешнего текстового файла в vi
  • Как удалить повторяющееся слово в редакторе vi?
  • Поиск круглых скобок с% в vim по линиям
  • странное поведение vi на OSX Debian ssh terminal
  • визуальный режим в vi для удаления символа в конце нескольких строк
  • 5 Solutions collect form web for “Как прокомментировать строку на основе слова, с которого оно начинается?”

    В vi :

     :%s/^HOST/#&/ 

    или

     :g/^HOST/s/^/#/ 

    % В первой команде означает «во всем буфере» и является коротким выражением 1,$ , т.е. от первой строки до последней. & в заменяющей части подстановки будет заменен на весь текст, соответствующий шаблону ( ^HOST ).

    Вторая команда применяет подстановку ( s ) ко всем строкам, соответствующим ^HOST с помощью глобальной ( g ) команды, которую vi унаследовал от редактора ed строк. Во втором случае мы просто вставляем # в начало строки ( ^ ).

    С sed :

     sed 's/^HOST/#&/' input >output 

    или

     sed '/^HOST/s/^/#/' input >output 

    таким же образом, как в vi ( sed всегда применяет все команды к каждой строке входного потока, поэтому мы не используем ничего подобного % или g явно с sed ).

    Используйте sed с опцией -i чтобы отредактировать файл на месте. (Резервная копия оригинала будет сохранена как file.txt.bak ). sed -i.bak 's/^\(HOST.*\)/#\1/g' file.txt

    Чтобы прочитать часть регулярного выражения: The ^ соответствует началу строки.

    () Захватывает соответствующий текст во временную внутреннюю переменную ( \1 ).

    Параметр \ нужен перед ( символами, так как ваша оболочка будет украсть их иначе.

    .* Соответствует 0 или более символам.

    Итак, начиная с фронта линии, он соответствует строке HOST за которой следует любой текст, вплоть до новой строки. Если строка не совпадает, оставьте ее как есть. Если он соответствует, то #\1 будет печатать # за которым следует текст между () .

    Выполнить через awk следующим образом:

     awk '{if($0 ~ /^HOST/){print "#"$0}else{print $0}}' file > file.conf 

    awk будет считывать данные из вашего файла, если строка начинается с HOST она будет печатать строку с # в начале, если не будет печатать ее как есть.

    > для сохранения выходов в file.conf

    Perl один вкладыш:

     perl -pe 's/^HOST/#$&/' file 

    Или, чтобы отредактировать файл на месте:

     perl -i -pe 's/^HOST/#$&/' file 

    объяснение

    Параметр -pe означает p rint каждую строку ввода после применения сценария, заданного -e . s/foo/bar/ является оператором замены и заменит первый экземпляр foo на bar на каждой строке. Здесь мы заменяем строки, начинающиеся с HOST ( ^ означает начало строки) с # и все, что было сопоставлено ( $& – специальная переменная, сохраняющая то, что соответствовало). Итак, мы заменим HOST на #HOST .

    perl однострочный:

     $ perl -ne 'if(/^HOST/){print "#$_"} else { print}' input.txt -------------------- NETWORKING=yes #HOSTNAME=wls1.ebs-testsrvrs.com # oracle-rdbms-server-12cR1-preinstall : Add NOZEROCONF=yes NOZEROCONF=yes -------------------- 

    Этот простой однострочный канал выполняет итерацию по всем строкам, проверяя, начинается ли строка с HOST и добавляет # к ней, иначе мы перейдем к инструкции else , которая просто печатает строку без изменений.

    Версия Python для одной и той же вещи будет следующей:

     python -c "import sys;print '\n'.join([ '#' + l.strip() if l.startswith('HOST') else l.strip() for l in sys.stdin ])" < input.txt 

    Это, однако, работает несколько иначе, путем создания списка (или массива) строк, вставки условной линии или строки с # добавлением. В конечном счете массив объединяется в одну большую строку с элементами, разделенными символами новой строки, и распечатывается.

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