___ qstnhdr___sat substitua todas as guias e espaços por um único espaço ______ qstntxt ___

Eu tenho uma string como esta:

%pre%

agora quero substituir todas as guias / espaços entre os registros por um único espaço, para que eu possa usá-lo facilmente com %code%

Eu tentei o seguinte:

%pre%

e várias varões, mas não conseguiram fazê-lo funcionar. Alguma idéia?

    
______ azszpr431168 ___

Use %code%

Aqui está uma explicação:

%pre%

Para sua substituição, você só deseja inserir um espaço. %code% não funcionará lá, já que é uma abreviação de uma classe de caracteres e o mecanismo de regex não saberia qual caractere colocar lá.

O %code% deve ser escapado na regex porque com o mecanismo de regex do sed %code% é um caractere normal, enquanto %code% é um metacaractere para '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 com escape porque "Ken Thompson achava que expressões regulares seriam usadas para trabalhar primariamente com C código, onde a necessidade de combinar parênteses crus seria mais comum do que a retro-referência. "Suponho que ele se sentia da mesma maneira sobre o sinal de mais, daí a necessidade de escapar para usá-lo como um metacaractere. É fácil ser enganado por isso .

No sed, você precisará fugir de %code% , %code% , %code% , %code% e %code% . ou use -r para usar a regex estendida (então, parece que %code% ou %code%

    
______ azszpr895113 ___

Você pode usar a opção %code% ("squeeze") de %code% :

%pre%

A classe de caractere %code% é composta por espaços e guias.

    
______ azszpr725625 ___

Eu gosto de usar o seguinte apelido para o bash. Com base no que os outros escreveram, use 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 corro através de sed mais uma vez para mudar o espaço para tabulação para que seja mais fácil de ler.

%pre%     
___

22

Eu tenho uma string como esta:

test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

agora quero substituir todas as guias / espaços entre os registros por 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 varões, mas não conseguiram fazê-lo funcionar. Alguma idéia?

    
por Zulakis 23.09.2012 / 20:17

3 respostas

37

Use sed -e "s/[[:space:]]\+/ /g"

Aqui está uma explicação:

[   # start of character class

  [:space:]  # The POSIX character class for whitespace characters. It's
             # functionally identical to [ \t\r\n\v\f] which matches a space,
             # tab, carriage return, newline, vertical tab, or form feed. See
             # https://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes

]   # end of character class

\+  # one or more of the previous item (anything matched in the brackets).

Para sua substituição, você só deseja inserir um espaço. [:space:] não funcionará lá, já que é uma abreviação de uma classe de caracteres e o mecanismo de regex não saberia qual caractere colocar lá.

O + deve ser escapado na regex porque com o mecanismo de regex do sed + é um caractere normal, enquanto \+ é um metacaractere para '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 com escape porque "Ken Thompson achava que expressões regulares seriam usadas para trabalhar primariamente com C código, onde a necessidade de combinar parênteses crus seria mais comum do que a retro-referência. "Suponho que ele se sentia da mesma maneira sobre o sinal de mais, daí a necessidade de escapar para usá-lo como um metacaractere. É fácil ser enganado por isso .

No sed, você precisará fugir de + , ? , | , ( e ) . ou use -r para usar a regex estendida (então, parece que sed -r -e "s/[[:space:]]\+/ /g" ou sed -re "s/[[:space:]]\+/ /g"

    
por 23.09.2012 / 20:24
5

Você pode usar a opção -s ("squeeze") de tr :

$ tr -s '[:blank:]' <<< 'test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600'
test.de. 1547 IN SOA ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

A classe de caractere [:blank:] é composta por espaços e guias.

    
por 01.02.2018 / 05:09
-2

Eu gosto de usar o seguinte apelido para o bash. Com base no que os outros escreveram, use 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 corro através de sed mais uma vez para mudar o espaço para tabulação para que seja mais fácil de ler.

alias ll='ls -lh | sed "s/ \+/ /g" | cut -f5,9 -d" " | sed "s/ /\t/g"'
    
por 29.09.2015 / 22:40