como podo os espaços em branco iniciais e finais de cada linha de alguma saída?

98

Eu gostaria de remover todos os espaços e tabulações iniciais e finais de cada linha em uma saída.

Existe uma ferramenta simples como trim eu poderia canalizar minha saída?

arquivo de exemplo:

test space at back 
 test space at front
TAB at end  
    TAB at front
some empty lines with differing TABS and spaces:





 test space at both ends 
    
por rubo77 21.11.2013 / 02:07

9 respostas

129
awk '{$1=$1;print}'

ou menor:

awk '{$1=$1};1'

Cortaria os espaços iniciais e finais ou os caracteres de tabulação 1 e também comprimiria sequências de guias e espaços em um único espaço.

Isso funciona porque quando você atribui algo a um dos campos , awk reconstrói o registro inteiro (conforme impresso por print ) unindo todos os campos ( $1 , ... , $NF ) com OFS (espaço por padrão).

1 (e possivelmente outros caracteres em branco, dependendo da localidade e da implementação awk )

    
por 27.05.2015 / 13:40
29

O comando pode ser condensado assim se você estiver usando o GNU sed :

$ sed 's/^[ \t]*//;s/[ \t]*$//' < file

Exemplo

Aqui está o comando acima em ação.

$ echo -e " \t   blahblah  \t  " | sed 's/^[ \t]*//;s/[ \t]*$//'
blahblah

Você pode usar hexdump para confirmar que o comando sed está removendo os caracteres desejados corretamente.

$ echo -e " \t   blahblah  \t  " | sed 's/^[ \t]*//;s/[ \t]*$//' | hexdump -C
00000000  62 6c 61 68 62 6c 61 68  0a                       |blahblah.|
00000009

Classes de caracteres

Você também pode usar nomes de classes de caracteres em vez de listar literalmente os conjuntos como este, [ \t] :

$ sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//' < file

Exemplo

$ echo -e " \t   blahblah  \t  " | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//'

A maioria das ferramentas GNU que usam expressões regulares (regex) suportam essas classes.

 [[:alnum:]]  - [A-Za-z0-9]     Alphanumeric characters
 [[:alpha:]]  - [A-Za-z]        Alphabetic characters
 [[:blank:]]  - [ \x09]         Space or tab characters only
 [[:cntrl:]]  - [\x00-\x19\x7F] Control characters
 [[:digit:]]  - [0-9]           Numeric characters
 [[:graph:]]  - [!-~]           Printable and visible characters
 [[:lower:]]  - [a-z]           Lower-case alphabetic characters
 [[:print:]]  - [ -~]           Printable (non-Control) characters
 [[:punct:]]  - [!-/:-@[-'{-~]  Punctuation characters
 [[:space:]]  - [ \t\v\f]       All whitespace chars
 [[:upper:]]  - [A-Z]           Upper-case alphabetic characters
 [[:xdigit:]] - [0-9a-fA-F]     Hexadecimal digit characters

Usar esses conjuntos ao invés de literais sempre parece um desperdício de espaço, mas se você está preocupado com o seu código ser portável, ou ter que lidar com conjuntos de caracteres alternativos (pense internacional), então você provavelmente vai querer usar os nomes das classes.

Referências

por 21.11.2013 / 04:03
18

Como sugerido por Stéphane Chazelas na resposta aceita, agora você pode crie um script /usr/local/bin/trim :

#!/bin/bash
awk '{$1=$1};1'

e dê a esse arquivo direitos executáveis:

chmod +x /usr/local/bin/trim

Agora você pode passar cada saída para trim , por exemplo:

cat file | trim

(para os comentários abaixo: eu usei isso antes: while read i; do echo "$i"; done
 que também funciona bem, mas tem menos desempenho)

    
por 22.11.2013 / 16:40
16

xargs sem argumentos, faça isso.

Exemplo:

trimmed_string=$(echo "no_trimmed_string" | xargs) 
    
por 09.09.2015 / 17:52
14
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'

Se você estiver lendo uma linha em uma variável do shell, read já o fez a menos que seja instruído de outra forma .

    
por 21.11.2013 / 02:09
6

Se você armazenar linhas como variáveis, você pode usar o bash para fazer o trabalho:

remove o espaço em branco inicial de uma string:

shopt -s extglob
echo ${text##+([[:space:]])}

remove o espaço em branco à direita de uma string:

shopt -s extglob
echo ${text%%+([[:space:]])}

remover todo o espaço em branco de uma string:

echo ${text//[[:space:]]}
    
por 22.04.2017 / 19:04
6

Para remover todos os espaços iniciais e finais de uma determinada linha, graças a uma ferramenta 'canalizada', posso identificar 3 formas diferentes que não são completamente equivalentes. Essas diferenças dizem respeito aos espaços entre as palavras da linha de entrada. Dependendo do comportamento esperado, você fará sua escolha.

Exemplos

Para explicar as diferenças, considere esta linha de entrada fictícia:

"   \t  A   \tB\tC   \t  "

tr

$ echo -e "   \t  A   \tB\tC   \t  " | tr -d "[:blank:]"
ABC

tr é realmente um comando simples. Nesse caso, exclui qualquer espaço ou caractere de tabulação.

awk

$ echo -e "   \t  A   \tB\tC   \t  " | awk '{$1=$1};1'
A B C

awk exclui os espaços iniciais e finais e pressiona para um único espaço todos os espaços entre as palavras.

sed

$ echo -e "   \t  A   \tB\tC   \t  " | sed 's/^[ \t]*//;s/[ \t]*$//'
A       B   C

Nesse caso, sed exclui os espaços iniciais e finais sem tocar em nenhum espaço entre as palavras.

Observação:

No caso de uma palavra por linha, tr faz o trabalho.

    
por 26.04.2016 / 17:55
5

sed é uma ótima ferramenta para isso:

                        # substitute ("s/")
sed 's/^[[:blank:]]*//; # parts of lines that start ("^")  with a space/tab 
     s/[[:blank:]]*$//' # or end ("$") with a space/tab
                        # with nothing (/)

Você pode usá-lo para o seu caso, seja canalizando o texto, por exemplo,

<file sed -e 's/^[[...

ou agindo sobre ele 'inline' se o seu sed é o GNU:

sed -i 's/...' file

mas mudar a fonte desta maneira é "perigoso", pois pode ser irrecuperável quando não funciona direito (ou mesmo quando isso acontece!), então faça o backup primeiro (ou use -i.bak , que também tem o benefício de ser portável para algum BSD sed s)!

    
por 21.11.2013 / 02:19
0
O comando

translate funcionaria

cat file | tr -d [:blank:]
    
por 28.09.2018 / 18:13