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:
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:
sednão suporta \d. Use [0-9]ou [[:digit:]].
+deve ser com barra invertida para obter o significado especial: \+.
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.
Respostas:
Como sed não é perl - as regexes sed não têm uma
\d
abreviação:aqui documentação de expressão regular .
fonte
/[[:digit:]]*\. /
corresponderá à sequênciafoo.
porque você permite zero dígitos. Se você quer uma ou mais uso\+
como mostradoDois problemas:
sed
não suporta\d
. Use[0-9]
ou[[:digit:]]
.+
deve ser com barra invertida para obter o significado especial:\+
.fonte
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 ...-E
não funciona para o GNU sed, ele usa em seu-r
lugar.sed
apenas suga quando se trata de portabilidade ...-E
no BSD sed e-r
no 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 scriptingA 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.
fonte