Enfrentando o problema com o comando Regex Inside Sed

2

Suponha que eu execute os seguintes comandos:

export STR="abcdef.ghijkl.mnopqr.stuvwy.log"
echo $STR | sed 's/\.[^.]*$//'

Estou obtendo o seguinte resultado:

abcdef.ghijkl.mnopqr.stuvwy

Por favor, ajude-me a entender o resultado acima.

    
por nvarun 03.08.2011 / 11:52

3 respostas

4

Seu padrão de sed \.[^.]*$ tem apenas uma correspondência para a string original: .log .

Detalhes:

  • \. corresponde apenas a um caractere de ponto.
  • [^.] corresponde a qualquer caractere diferente de .
  • [^.]* corresponde a qualquer sequência de caracteres diferente de .
  • $ corresponde ao fim da linha.

Portanto, a% final .log é a única correspondência ( .stuvwy.log não é uma correspondência porque contém um ponto interno). sed substituirá isso pela string vazia, conforme solicitado pelo comando s/\.[^.]*$// . Portanto, você acaba com:

abcdef.ghijkl.mnopqr.stuvwy
    
por 03.08.2011 / 12:01
3

Se você não quiser usar sed , pode usar a substituição de padrão integrada do shell. Isso é realmente mais rápido, não ter que chamar um programa externo.

${VAR%.*} removerá a correspondência do padrão de glob .* da end da sequência em $VAR . Lembre-se de que é um glob e não regex, portanto, . significa literal ".".

$ foo=aaa.bbbb.2011.log
$ echo ${foo%.*}
aaa.bbbb.2011

Veja Shell-Parâmetro-Expansão na página de manual do BASH para mais informações.

    
por 04.08.2011 / 01:16
2

s/\.[^.]*$// == Substitua a primeira parte da sequência (porque não há g opção no final para corresponder a todas as ocorrências) que começa com um ponto ( \. ), seguido por zero ou mais ( * ) caracteres que não são pontos ( [^.] ), colocados no final da string ( $ ), com a string vazia ( // ).

    
por 03.08.2011 / 12:04

Tags