Como combinar dígitos seguidos por um ponto usando sed?


76

Estou tentando usar sedpara substituir todos os padrões com dígitos seguidos imediatamente por um ponto (como 3., 355.) por uma string vazia. Então eu tento:

sed 's/\d+\.//g' file.txt

Mas isso não funciona. Por que é que?


11
Achei este artigo muito útil.
Stphane

Respostas:


111

Como sed não é perl - as regexes sed não têm uma \dabreviação:

sed 's/[[:digit:]]\+\.//g'

aqui documentação de expressão regular .


3
Isso se você quiser zero ou mais dígitos. /[[:digit:]]*\. /corresponderá à sequência foo.porque você permite zero dígitos. Se você quer uma ou mais uso \+como mostrado
glenn jackman

71

Dois problemas:

  1. sednão suporta \d. Use [0-9]ou [[:digit:]].

  2. +deve ser com barra invertida para obter o significado especial: \+.


6
em vez de backslashing a + (que não funciona em Mac OS X, por exemplo) você pode usar a opção -E para interpret regular expressions as extended (modern) regular expressions rather than basic regular expressions (BRE's).Infelizmente, isso não ajuda com a questão \ d ...
gMale

4
@gmale: -Enão funciona para o GNU sed, ele usa em seu -rlugar.
choroba

12
Ok ... com certeza parece sedapenas suga quando se trata de portabilidade ...
iconoclasta

@choroba Acho que me confundi hoje. Eu vou apagar minhas observações barulhentos ...
Steven Lu

Basicamente, o que eu estava tentando alertar as pessoas é: Se você não usa regex extendido ( -Eno BSD sed e -rno GNU sed), no BSD sed, +nem o \+( nem com o mesmo ?) funcionará, enquanto no GNU sed você pode faça com que eles trabalhem com a barra invertida. Daí a recomendação comum de usar regex prolongada em scripting
Steven Lu

3

A página do manual sed referencia a página do manual re_format. Faz duas distinções: (1) expressões regulares obsoletas versus estendidas; (2) expressões regulares não aprimoradas versus expressões regulares aprimoradas. Todas as 4 combinações são possíveis. Há suporte no sed para obsoletos e estendidos, mas em ambos os casos apenas para não aprimorados. O operador \ d é um recurso de expressões regulares aprimoradas, portanto, não é suportado pelo sed.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.