Qual é o uso do padrão antes de substituir o comando em sed

3

Há um exemplo neste link sobre sed :

Para excluir o primeiro número em todas as linhas que começam com um uso "#":

sed '/^#/ s/[0-9][0-9]*//'

Qual é o benefício do primeiro padrão ( /^#/ )? Poderia ser simplesmente:

sed 's/^#[0-9][0-9]*//'
    
por Majid Azimi 18.04.2012 / 08:11

2 respostas

6

O formato geral dos comandos sed é

[address[,address]] function

Quando um comando tem um único endereço, ele opera em todas as linhas que correspondem a esse endereço. Quando um comando não tem endereço, ele opera em todas as linhas.

Referência: POSIX sed

Com relação aos seus exemplos específicos:

  • /^#/ s/[0-9][0-9]*//

    • Este comando tem um endereço, /^#/ , que corresponde a todas as linhas que começam com # .

    • O padrão de substituição é /[0-9][0-9]*/ . Isso corresponde à primeira seqüência de dígitos onde quer que ela ocorra na linha.

    • Resumo em inglês simples : exclua a primeira sequência de dígitos em todas as linhas que começam com # .

    • Exemplo : # non-digits|5555|non-digits|5555 torna-se # non-digits||non-digits|5555

  • s/^#[0-9][0-9]*//

    • Não há endereço, então este comando opera em todas as linhas.

    • O padrão de substituição, /^#[0-9][0-9]*/ , corresponde a uma sequência de dígitos consecutivos precedidos por um # ancorado no início da linha.

    • Resumo em inglês simples : exclua # seguido por uma sequência de dígitos (e somente esse padrão) desde o início de cada linha.

    • Exemplo : #5555|non-digits|5555 torna-se |non-digits|5555 , mas # non-digits|5555|non-digits|5555 permanece inalterado porque a substituição padrão não corresponde.

por 18.04.2012 / 08:50
2

O primeiro corresponderá e substituirá:

#abc99

O segundo não vai.

Além disso, o segundo também removerá o # inicial.

    
por 18.04.2012 / 08:17