Maneira mais simples de comentar/descomentar certas linhas usando linha de comando

Maneira mais simples de comentar/descomentar certas linhas usando linha de comando

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.confon-line 14para 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

sedA 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 fooaté aquela que contém bar, use:

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

Sistemas BSD (OSX)

Com BSD sed, a -iopçã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 -iopçã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/ elseou 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

informação relacionada