Como substituir string em arquivos, exceto com uma linha começa com # [duplicate]

1

Eu olhei para algumas outras questões relacionadas ao uso de sed para substituir as strings, mas estou tendo problemas para descobrir como aplicá-lo à minha necessidade específica.

Em um caso como o snippet abaixo, quero alterar a string apenas nas linhas que não começam com "#":

    #####################################
    # Blah blah blah string blah blah
    #####################################

    PKG_NAME="string"
    PKG_DESC="string-foo"

Eu gostaria que a saída fosse assim:

    #####################################
    # Blah blah blah string blah blah
    #####################################

    PKG_NAME="newString"
    PKG_DESC="newString-foo"

Pelo que eu reuni, acho que posso usar o find e sed para alterar todas as strings em todos os arquivos

find . -type f -exec sed -i 's/string/newString/g' {} +

Mas estou com dificuldades para descobrir como adicionar uma exceção para as linhas que começam com "#". Estou aberto a outras maneiras de fazer isso, além de sed, por isso, se houver uma maneira mais fácil, por favor, sinta-se à vontade para compartilhar.

Depois de ler Como somente substituir linhas que combinam vários padrões em sed? , eu vejo como mudar uma string em casos onde uma linha começa com um certo padrão, mas o que eu preciso é mudar linhas onde o padrão é não encontrado.

    
por Geoff 25.08.2015 / 21:09

2 respostas

2

Você deseja alterar essas "strings" que estão em linhas onde não há # caractere ou esse caractere é depois de "string", para que você possa ter comentários no final de as linhas:

#####################################
# Blah blah blah string blah blah
#####################################

PKG_NAME="string"
PKG_DESC="string-foo"
PKG_A="string" # this is comment after string

Para isso, execute corretamente

sed 's/^\([^#]*\)string/newString/' file

Resultado:

#####################################
# Blah blah blah string blah blah
#####################################

PKG_NAME="newString"
PKG_DESC="newString-foo"
PKG_A="newString" # this is comment after string
    
por 25.08.2015 / 21:30
3

Em sed , você pode parar de realizar ações se um padrão for encontrado com um ponto de exclamação:

sed '/#/!s/string/replacement/' file

Ou seja. para linhas que combinem com '#' (em qualquer posição), não faça a substituição - senão. No seu caso, o resultado é:

#####################################
# Blah blah blah string blah blah
#####################################

PKG_NAME="replacement"
PKG_DESC="replacement-foo"

Para pular apenas linhas que começam com hash, altere o regex para:

sed '/^#/!s/string/replacement/' file

Observe que as linhas com comentários no final da linha também terão as alterações aplicadas à parte comentada, enquanto no exemplo superior essas linhas não serão alteradas (incluindo a parte do código).

    
por 25.08.2015 / 21:18