Sed e expressões regulares

1

Eu tenho um problema com alguma expressão regular em sed .

Eu quero mudar uma linha no meu arquivo, então eu fiz assim:

sed -i '3s/.*/my new text in file/' file.txt .

Esta extensão está procurando pela terceira linha em um arquivo e a altera.

Esta solução não é boa, mas não sei como criar uma boa extensão regular. Digamos que estou procurando a palavra 'Host' em algum arquivo. Como construir uma boa extensão regular?

Eu tentei o seguinte:

sed -e '<\H...s>\ /my new text in file/' file.txt '.

O que estou fazendo de errado?

    
por SanHolo 26.01.2017 / 09:28

2 respostas

0
$ sed 's/^.*[[:<:]]Host[[:>:]].*$/replacement text/' file.txt

O texto acima substituirá todas as linhas do arquivo file.txt que contém a palavra Host com a string replacement text . O resultado será dado na saída padrão.

O [[:<:]] é um padrão de comprimento zero que corresponde ao início de uma palavra. Da mesma forma, [[:>:]] corresponderá ao final de uma palavra. Isso significa que a substituição acima não substituirá uma linha pela palavra Hostname ou xHost (a menos que a palavra Host apareça em outro lugar na linha).

    
por 26.01.2017 / 09:39
2

Embora quase ninguém pareça usá-lo, sed fornece um comando c (change) para substituição de linha inteira:

c\ 
text

    Delete the lines matching the address or address-range, and 
    output the lines of text which follow this command.

Então, por exemplo, você poderia usar

sed '/\bHost\b/c\                      
my new text
' file

para alterar as linhas que contêm a palavra inteira Host para my new text . A sequência \b representa um limite de palavra, portanto, excluirá correspondências parciais como Hostname - no GNU sed, você pode usar \< e \> , ou seja, \<Host\> e também pode colocar o novo texto em um único linha:

sed '/\<Host\>/cmy new text' hostfile

que parece ser o que você estava procurando em sua expressão - você acabou de perder o comando c real e reclassificou os especificadores de limite de palavras, ou seja, <\. . .>\ no lugar de \<. . .\>

    
por 26.01.2017 / 15:08