
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 sed
comandos é
[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|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#
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|5555
torna-se|non-digits|5555
, mas# non-digits|5555|non-digits|5555
permanece 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 #
.