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

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

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

например:

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

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

решение1

Чтобы прокомментировать строки 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опция нуждается в аргументе, даже если это просто пустая строка. Таким образом, например, замените команду top выше на:

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

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

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

решение2

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

sed -i '14,18 s/^/#/' bla.conf
sed -i '14,18 s/^##*//' bla.conf

решение3

Вы можете создать 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

решение4

С использованиемРаку(ранее известный как Perl_6)


Строки комментариев:

~$ raku -ne 'if (6 <= ++$ <= 8) { put S/^/#/ } else { $_.put };' alpha10.txt

#OR

~$ raku -ne '(6 <= ++$ <= 8) ?? put S/^/#/ !! $_.put;' alpha10.txt

#OR

~$ raku -ne 'put (6 <= ++$ <= 8) ?? S/^/#/ !! $_;' alpha10.txt

#OR

~$ raku -pe 'if (6 <= ++$ <= 8) { s/^/#/ };' alpha10.txt

Пример ввода:

~$ raku -e 'print "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\n";' > alpha10.txt

Пример вывода:

a
b
c
d
e
#f
#g
#h
i
j

Эти ответы (выше и ниже) используют условный синтаксис Raku, либо if/ else, либо тернарный: "Test ??True !!False". Подробности см. в URL-адресах ниже. Обратите внимание на цепочку <=неравенств. Также: скобки вокруг условного оператора излишни. А если у вас возникнут трудности с кавычками, #octothorpe можно ввести как односимвольный, индивидуальный класс символов через <[#]>, (с квантификатором или без него).


Раскомментируйте строки:

~$ raku -ne 'if (6 <= ++$ <= 8) { put S/^ \s* "#" // } else { $_.put };' alpha10commented.txt

#OR

~$ raku -ne '(6 <= ++$ <= 8) ?? put S/^ \s* "#"// !! $_.put;' alpha10commented.txt

#OR

~$ raku -ne 'put (6 <= ++$ <= 8) ?? S/^ \s* "#" // !! $_;' alpha10commented.txt

#OR

~$ raku -pe 'if (6 <= ++$ <= 8) { s/^ \s* "#" // };' alpha10commented.txt

Пример ввода:

~$ raku -e 'print "a\nb\nc\nd\ne\n#f\n#g\n#h\ni\nj\n";' > alpha10commented.txt

Пример вывода:

a
b
c
d
e
f
g
h
i
j

https://docs.raku.org/syntax/if
https://docs.raku.org/language/operators#index-entry-operator_ternary
https://raku.org

Связанный контент