Qual é o uso do padrão antes do comando substituto no sed

Qual é o uso do padrão antes do comando substituto no sed

Há um exemplo nestelinksobre sed:

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

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

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

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

Responder1

O formato geral dos sedcomandos é

[address[,address]] function

Quando um comando possui 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:POSIXsed


Em 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 a #.

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

    • Resumo em inglês simples: exclua a primeira sequência de dígitos em cada linha começando com a #.

    • Exemplo: # non-digits|5555|non-digits|5555torna-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# ancoradono início da linha.

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

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

Responder2

O primeiro irá combinar e substituir:

#abc99

O segundo não.

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

informação relacionada