SED altera apenas o início da linha e preserva o fim da linha

2

Basicamente eu tenho uma situação onde eu freqüentemente preciso modificar meu arquivo hosts para acessar diferentes servidores no meu local de trabalho. Em uma tentativa de automatizar o processo. Eu tenho tentado usar sed para fazer as alterações que preciso. Basicamente eu estou tentando preservar toda a linha para alguns IP's e comentar outros IP's.

Para IPs que começam com 10.4. Para remover o comentário via sed , tentei isso

sed -i '/#10\.4\..*/c\.4\..*' /etc/hosts

que substituiu todas as linhas correspondentes por 10.4..* em vez de preservar toda a linha. Eu também tentei isso em uma tentativa de usar um grupo / correspondência:

sed -i '/#10\.4\.(.*)/c\.4\.' /etc/hosts

mas isso falha silenciosamente sem fazer nenhuma alteração.

O que estou fazendo de errado?

    
por Paul Nelson Baker 10.02.2014 / 21:21

2 respostas

5

Para remover comentários de linhas que têm um IP começando com 10.4 (isso removerá o primeiro # , suponho que você nunca terá mais):

sed -i '/^#10\.4/{s/^#//}' /etc/hosts

Para adicionar um comentário a essas linhas:

sed -i '/^10\.4/{s/^/#/}' /etc/hosts

Então, por que a sua falha? Você estava usando c\ , o que significa:

c\
text

Delete the lines matching the address or address-range, and output the lines of text which follow this command (each but the last ending with a \, which are removed from the output) in place of the last line (or in place of each line, if no addresses were specified). A new cycle is started after this command is done, since the pattern space will have been deleted.

Então, quando você executou sed -i '/#10\.4\..*/c\.4\..*' /etc/hosts , isso significava "substituir #10\.4\..* pela string literal #10\.4\..* ". O que você queria fazer é:

sed -i 's/#10\.4\.\(.*\)/10.4./' /etc/hosts'

O texto acima usa um operador de substituição ( s/from/to/ ) e captura de padrão, o primeiro padrão em \( \) pode ser referido como , o segundo como etc. Como você pode ver na resposta de Michael não é necessário, você pode simplesmente substituir #10.4 por 10.4 . Ou, como na minha resposta acima, você pode simplesmente remover o # sozinho.

    
por 10.02.2014 / 21:46
3

Se tudo o que você deseja é remover # das linhas que iniciam #10.4. , você pode usar o comando s , que substitui as expressões regulares correspondentes pelo texto substituto fornecido e deixa o resto da linha inalterada. Qualquer um desses trabalhos:

$ sed -i 's/^#10\.4\./10.4./' /etc/hosts
$ sed -i -r 's/^#(10\.4\.)//' /etc/hosts
    
por 10.02.2014 / 21:42