Maneira mais simples de comentar / descomentar determinadas linhas usando a linha de comando


37

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 on bla.conf-line14 em 18. Normalmente eu uso sed, mas devo conhecer o conteúdo dessas linhas e, em seguida, executar uma operação de localizar e substituir, e isso daria um resultado errado quando houver mais de uma agulha (e só queremos substituir a N-ésima 1).


11
Há um A para esta intitulada Q: Uncommenting várias linhas de código, especificado pelo número de linha, usando vi ou vim que mostra diversos métodos para fazer isso usando sed, perletc. Especificamente a A por terdon!
Slm

Respostas:


46

Para comentar as linhas 2 a 4 do bla.conf:

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

Para fazer o comando que você queria, basta colocar o acima em um script de shell chamado comment:

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

Esse script é usado da mesma forma que o seu, com a exceção de que a primeira e a última linha devem ser separadas por vírgula e não por hífen. Por exemplo:

comment 2,4 bla.conf

Um comando de não comentário pode ser criado analogamente.

Recurso avançado

sedA seleção de linhas é bastante poderosa. Além de especificar a primeira e a última linha por número, também é possível especificá-las por uma regex. Portanto, se você deseja comandar todas as linhas da que contém fooaté a que contém bar, use:

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

Sistemas BSD (OSX)

Com o BSD sed, a -iopção precisa de um argumento, mesmo que seja apenas uma string vazia. Assim, por exemplo, substitua o comando superior acima por:

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

E, substitua o comando no script por:

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

11
O duplo 'após a -iopção é intencional? Não precisava deles.
24915 raphinesse


2

Você pode usar o Vim no modo Ex:

ex -sc 'g/^\s*[^#]/s/^/#/' -cx bla.conf
ex -sc 'g/^\s*#/s/#//' -cx bla.conf
  1. g regex global

  2. s substituto

  3. x salvar e fechar


2

Você pode criar um arquivo 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.