sed corresponde ao padrão e age sobre x linhas depois

5

Estou tentando encontrar uma maneira de comentar um bloco (várias linhas) em um arquivo de configuração. Eu gostaria de combinar com a primeira linha, mas também agir em cada linha depois disso.

sed '/\/Some\/Foo\/Bar\/String/' config.file

O seguinte exemplo de "código" é o que eu estou tentando combinar e comentar. O bloco sempre terminará com um}, mas eu também sei o número de linhas após o padrão, então este seria o padrão + 6.

foo { '/Some/Foo/Bar/String' :
    key1 => value1,
    key2 => value2,
    key3 => value3,
    key4 => value4,
    key5 => value5,
}

Resultados após o comando sed

#foo { '/Some/Foo/Bar/String' :
#    key1 => value1,
#    key2 => value2,
#    key3 => value3,
#    key4 => value4,
#    key5 => value5,
#}
    
por LF4 23.03.2015 / 23:17

1 resposta

5

sed nos permite definir intervalos de linhas e, em seguida, aplicar somente substituições dentro desses intervalos. Podemos definir um intervalo começando com uma linha contendo Some/Foo/Bar/String e terminando com uma linha contendo } e, em seguida, aplicar um comando substituto para comentar essas linhas:

$ sed '\|/Some/Foo/Bar/String|,/}/ s/^/#/' file
#foo { '/Some/Foo/Bar/String' :
#    key1 => value1,
#    key2 => value2,
#    key3 => value3,
#    key4 => value4,
#    key5 => value5,
#}

Detalhes

  • \|/Some/Foo/Bar/String|, /}/

    Isso define o intervalo. Ele poderia ter sido escrito como /\/Some\/Foo\/Bar\/String/, /}/ , mas, para evitar barras invertidas, usei | como o delimitador no lugar de / para o primeiro regex.

  • s/^/#/

    Isso é aplicado somente às linhas do intervalo e as comenta.

por 23.03.2015 / 23:21

Tags