Existe uma maneira de comentar/descomentar um script shell/config/ruby usando a linha de comando?
por exemplo:
$ comment 14-18 bla.conf
$ uncomment 14-18 bla.conf
isso adicionaria ou removeria #
o login bla.conf
on-line 14
para 18
. Normalmente eu uso sed
, mas preciso saber o conteúdo dessas linhas e então fazer uma operação localizar-substituir, e isso daria um resultado errado quando houvesse mais de uma agulha (e só queremos substituir a N-ésima um).
Responder1
Para comentar as linhas 2 a 4 do bla.conf:
sed -i '2,4 s/^/#/' bla.conf
Para fazer o comando que você deseja, basta colocar o acima em um script de shell chamado comment:
#!/bin/sh
sed -i "$1"' s/^/#/' "$2"
Este script é usado da mesma forma que o seu, com a exceção de que a primeira e a última linhas devem ser separadas por uma vírgula em vez de um travessão. Por exemplo:
comment 2,4 bla.conf
Um comando para remover comentário pode ser criado de forma análoga.
Recurso avançado
sed
A seleção de linha do é bastante poderosa. Além de especificar a primeira e a última linha por número, também é possível especificá-las por meio de uma regex. Então, se você quiser comandar todas as linhas daquela que contém foo
até aquela que contém bar
, use:
comment '/foo/,/bar/' bla.conf
Sistemas BSD (OSX)
Com BSD sed, a -i
opção precisa de um argumento mesmo que seja apenas uma string vazia. Assim, por exemplo, substitua o comando top acima por:
sed -i '' '2,4 s/^/#/' bla.conf
E substitua o comando no script por:
sed -i '' "$1"' s/^/#/' "$2"
Responder2
Com GNU sed (para substituir os arquivos no local pela -i
opção):
sed -i '14,18 s/^/#/' bla.conf
sed -i '14,18 s/^##*//' bla.conf
Responder3
Você pode criar um bash_file com funções para reutilizá-lo em seus projetos
#!/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
Responder4
UsandoRaku(anteriormente conhecido como Perl_6)
Linhas de comentários:
~$ 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
Entrada de amostra:
~$ raku -e 'print "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\n";' > alpha10.txt
Saída de amostra:
a
b
c
d
e
#f
#g
#h
i
j
Essas respostas (acima E abaixo) aproveitam a sintaxe condicional do Raku, seja if
/ else
ou ternária: "Test ??
True !!
False". Consulte os URLs abaixo para obter detalhes. Observe as <=
desigualdades encadeadas. Além disso: parênteses em torno da condicional são supérfluos. E caso você encontre dificuldades de cotação, o #
octothorpe pode ser inserido como uma classe de caractere personalizada de um único caractere via <[#]>
, (com ou sem um quantificador).
Remova o comentário das linhas:
~$ 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
Entrada de amostra:
~$ raku -e 'print "a\nb\nc\nd\ne\n#f\n#g\n#h\ni\nj\n";' > alpha10commented.txt
Saída de amostra:
a
b
c
d
e
f
g
h
i
j
https://docs.raku.org/syntax/if
https://docs.raku.org/linguagem/operators#index-entry-operator_ternary
https://raku.org