Questão Como combinar o espaço em branco no sed?


Como posso combinar o espaço em branco no sed? Nos meus dados eu quero combinar todos os 3 + caracteres de espaços em branco subseqüentes (espaço de tabulação) e substituí-los por dois espaços. Como isso pode ser feito?


185


origem




Respostas:


A classe de personagem \s irá coincidir com os caracteres de espaço em branco <tab> e <space>.

Por exemplo:

$ sed -e "s/\s\{3,\}/  /g" inputFile

irá substituir todas as seqüências de pelo menos 3 espaços em branco com dois espaços.


OBSERVAÇÃO: Para conformidade com POSIX, use a classe de caractere [[:space:]] ao invés de \s, já que o último é uma extensão do GNU sed. Veja as especificações POSIX para sed e BREs


192



aha! Foi a falta -e interruptor que me pegou. - sequoia mcdowell
Eu também tive que adicionar a opção '-r', que permite que os regexs estendidos façam o sed reconhecer '\ s' como espaço. - HUB
Com a Apple sed Eu tive que usar [[:space:]] Porque \s não funcionou para mim. Possivelmente \s é um Sed GNU extensão? - Jared Beck
@JaredBeck obrigado, estava ficando sem idéias porque meu regex simples não estava funcionando .. Isso é manco, eu pensei que era regex estendido padrão .. Também -r não funciona e -E fez agachamento - Karthik T
Obrigado pelo feedback. Eu atualizei a resposta com links para o padrão POSIX. - mrucci


Isso funciona no MacOS 10.8:

sed -E "s/[[:space:]]+/ /g"

55



Você sabe se isso funciona em todas as distribuições do Linux? - amphibient
Geralmente não Sed GNU não terá -E. A partir da página do BSD sed man: "As opções -E, -a e -i são extensões não padronizadas do FreeBSD e podem não estar disponíveis em outros sistemas operacionais." - Brad Koch
Por que você precisa do sinalizador -E para o operador +? A maioria das expressões provavelmente estaria bem com * em vez disso, então isso funcionaria em outras plataformas. - Samuel
@Samuel Se você usar *, o regex corresponderá a zero ou mais espaços, e você terá um espaço entre cada caractere e um espaço em cada final de cada linha. Se você não tem o sinalizador -E, então você quer sed "s/[[:space:]]\+/ /g" para combinar um ou mais espaços. - jbo5112
FWIW, o sed do NetBSD suporta o -E bandeira também. - mcandre


Algumas versões mais antigas do sed não podem reconhecer \ s como um token de correspondência de espaço em branco. Nesse caso, você pode combinar uma sequência de um ou mais espaços e tabulações com '[XZ] [XZ] *', onde X é um espaço e Z é uma tabulação.


13



Então, para a necessidade particular aqui, com um sed mais antigo, você poderia fazer: $ sed / s / [XZ] [XZ] [XZ] [XZ] * / / g 'inputfile onde X é uma tabulação e Z é um espaço. - Marnix A. van Ammers


sed 's/[ \t]*/"space or tab"/'

8



Isso é garantido para funcionar em qualquer versão do sed em algum sistema? Se não, vale a pena mencionar onde isso funciona de maneira semelhante às outras respostas, apenas para conhecermos as limitações e onde isso pode não ter o resultado pretendido. - Mokubai♦
Esse RE é o que eu uso para corresponder ao espaço em branco. É mais simples que as classes de caracteres apenas para combinar a tabulação ou o espaço. Ele usa apenas as convenções mais básicas de expressões regulares, por isso deve funcionar em qualquer lugar com uma implementação funcional de expressões regulares. - Nate
No Mac 10.9.5, isso corresponde a espaços e 't'. Eu usei o acima de Michael Douma para combinar com chars de espaço em branco (ele também funciona com -e). - Alien Life Form
Não funciona de maneira sensata no meu sistema SUSE. Ele corresponde ao primeiro lugar na linha onde há zero ou mais espaços, o que é antes do primeiro caractere. Duvido que essa seja a função pretendida e certamente não foi o caso de uso solicitado. Eu acredito que você quer mudar o '*' para '\ +' (ou '\ {3, \}' de acordo com a questão) e talvez colocar um g no final do comando sed para combinar todas as ocorrências do padrão. Substituir [\ t] por [[espaço:]] também pode ser desejável, caso haja algo mais para espaço em branco na linha. - jbo5112