Самый простой способ комментировать / раскомментировать определенные строки с помощью командной строки

37

Есть ли способ комментировать / раскомментировать сценарий shell / config / ruby ​​с помощью командной строки?

например:

$ comment 14-18 bla.conf
$ uncomment 14-18 bla.conf

это добавит или удалит #знак bla.confна линии 14к 18. Обычно я использую sed, но я должен знать содержимое этих строк, а затем выполнить операцию поиска и замены, и это даст неверный результат, если имеется более одной иглы (и мы хотим заменить только N-ю один).

Kokizzu
источник
1
Существует Л к этому Q под названием: раскомментировав несколько строк кода, указанного номера строк, используя VI или Vim , который показывает множество способов сделать это с помощью sed, perlи т.д. В частности, А по terdon!
СЛМ

Ответы:

46

Чтобы прокомментировать строки со 2 по 4 из bla.conf:

sed -i '2,4 s/^/#/' bla.conf

Чтобы создать команду, которую вы хотели, просто поместите вышеупомянутое в сценарий оболочки с именем comment:

#!/bin/sh
sed -i "$1"' s/^/#/' "$2"

Этот скрипт используется так же, как ваш, за исключением того, что первая и последняя строки должны быть разделены запятой, а не тире. Например:

comment 2,4 bla.conf

Команда раскомментирования может быть создана аналогично.

Расширенная функция

sedВыбор линии довольно мощный. Помимо указания первой и последней строк по номеру, их также можно указать с помощью регулярного выражения. Итак, если вы хотите командовать всеми строками от той, которая содержит fooдо той, которая содержит bar, используйте:

comment '/foo/,/bar/' bla.conf

Системы BSD (OSX)

При использовании BSD sed для -iпараметра требуется аргумент, даже если это просто пустая строка. Таким образом, например, замените верхнюю команду выше:

sed -i '' '2,4 s/^/#/' bla.conf

И замените команду в скрипте на:

sed -i '' "$1"' s/^/#/' "$2"
John1024
источник
1
Являются ли двойные 'после -iопции преднамеренными? Они не нужны.
рафинесс
8

С GNU sed (для замены файлов на месте с -iопцией):

sed -i '14,18 s/^/#/' bla.conf
sed -i '14,18 s/^##*//' bla.conf
Жиль "ТАК - прекрати быть злым"
источник
2

Вы можете использовать Vim в режиме Ex:

ex -sc 'g/^\s*[^#]/s/^/#/' -cx bla.conf
ex -sc 'g/^\s*#/s/#//' -cx bla.conf
  1. g глобальное регулярное выражение

  2. s замена

  3. x сохранить и закрыть

Стивен Пенни
источник
2

Вы можете создать bash_file с функциями, чтобы использовать его в своих проектах

#!/bin/bash

# your target file
CONFIG=./config.txt

# comment target
comment() {
  sed -i '' "s/^$1/#$1/" $CONFIG
}

# comment target
uncomment() {
  echo $1
  sed -i '' "s/^#$1/$1/" $CONFIG
}


# Use it so:
uncomment enable_uart
comment arm_freq
январь
источник