Eu tenho uma string como a seguinte:
test.de. 1547 IN SOA ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600
agora eu quero substituir todas as guias / espaços entre os registros por apenas um único espaço para que eu possa usá-lo facilmente com cut -d " "
Eu tentei o seguinte:
sed "s/[\t[:space:]]+/[:space:]/g"
e várias variações, mas não conseguiu fazê-lo funcionar. Alguma ideia?
cut
suporte-w
?Respostas:
Usar
sed -e "s/[[:space:]]\+/ /g"
Aqui está uma explicação:
Para sua substituição, você deseja inserir apenas um espaço.
[:space:]
não funcionará lá, pois é uma abreviação para uma classe de personagem e o mecanismo de expressão regular não saberia qual caractere colocar lá.O
+
escape deve ser escapado no regex porque, com o mecanismo de regex do sed,+
é um caractere normal, enquanto\+
é um metacaractere de 'um ou mais'. Na página 86 de Mastering Regular Expressions , Jeffrey Friedl menciona em uma nota de rodapé que ed e grep usavam parênteses escapados porque "Ken Thompson achou que expressões regulares seriam usadas para trabalhar principalmente com código C, onde a necessidade de combinar parênteses brutos seria mais comum do que a referência remota. . " Suponho que ele se sentiu da mesma maneira com o sinal de mais, daí a necessidade de escapar dele para usá-lo como um metacaractere. É fácil ser enganado por isso.Em sed você precisa escapar
+
,?
,|
,(
, e)
. ou use -r para usar regex estendido (então parecesed -r -e "s/[[:space:]]\+/ /g"
oused -re "s/[[:space:]]\+/ /g"
fonte
\+
vez de apenas+
?\+
Você pode usar a opção
-s
("squeeze") detr
:A
[:blank:]
classe de caracteres compreende espaços e tabulações.fonte
Eu gosto de usar o seguinte alias para o bash. Com base no que os outros escreveram, use o sed para pesquisar e substituir vários espaços por um único espaço. Isso ajuda a obter resultados consistentes do corte. No final, eu o passo através do sed mais uma vez para mudar o espaço para a guia, para que seja mais fácil de ler.
fonte