SED substitui depois de ignorar

1

Existem muitas linhas em um arquivo de texto e eu gostaria de alterar o valor true to false usando um script de uma linha.

bash-3.2$ grep online test.txt
# online = false --> ONE SHOT import (delete all table contents before importing)
# online = true  --> DIFFERENTIAL import (import without clean the table contents)
online =  true

Eu tentei isso

sed -i.bak '/DIFFERENTIAL\|/ONE SHOT\/!s/online.*/online = false/g'

mas deu este erro:

sed: -e expression #1, char 17: unknown command: 'O'

Eu não quero que as duas primeiras linhas sejam alteradas, apenas a terceira online = true se torne online = false . Pode estar em qualquer lugar no arquivo, mas corresponderá a online = . Então, eu gostaria que meu comando ignorasse 1 e 2 e mudasse apenas 3.

    
por Peck 31.03.2015 / 18:55

2 respostas

2

Se você só quer alterar as linhas que começam com online , talvez seja mais fácil fazer isso:

sed 's/^online\ *=.*/online = false/g'

Desta forma, as linhas que começam com # são completamente ignoradas.

Uma alternativa ainda mais simples (mas não idêntica), sugerida por @mikeserv:

sed '/^online/s/true/false/'
    
por 31.03.2015 / 19:08
1

Por :

awk '/online =/{c++} c==3{gsub("true","false")}1' test.txt

Isso corresponderá a todas as ocorrências de online = e incrementará o sinalizador do contador c++ ; Quando 3 ocorrências encontraram c==3 , então substitua o verdadeiro por falso .

    
por 31.03.2015 / 19:11