Есть ли способ закомментировать/раскомментировать скрипт 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