Gostaria de remover todos os espaços e guias à esquerda e à direita de cada linha de 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
sequence of some space in the middle
some empty lines with differing TABS and spaces:
test space at both ends
Respostas:
ou mais curto:
Cortaria os caracteres à esquerda e à esquerda ou os caracteres de tabulação 1 e também comprimiria seqüências de tabs e espaços em um único espaço.
Isso funciona porque quando você atribui algo a um dos campos ,
awk
reconstrói todo o registro (conforme impresso porprint
) juntando todos os campos ($1
, ...,$NF
) comOFS
(espaço por padrão).1 (e possivelmente outros caracteres em branco, dependendo da localidade e da
awk
implementação)fonte
awk '{$1=$1}1'
;
é exigido na sintaxe awk padrãoecho -e 'foo \t bar' | awk '{$1=$1};1'
echo ' hello ' | xargs
O comando pode ser condensado assim, se você estiver usando o GNU
sed
:Exemplo
Aqui está o comando acima em ação.
Você pode
hexdump
confirmar se osed
comando está removendo os caracteres desejados corretamente.Classes de caracteres
Você também pode usar nomes de classes de caracteres em vez de listar literalmente os conjuntos como este
[ \t]
:Exemplo
A maioria das ferramentas GNU que usam expressões regulares (regex) suportam essas classes.
Usar esses conjuntos em vez de conjuntos literais sempre parece um desperdício de espaço, mas se você estiver preocupado com seu código ser portátil ou precisar lidar com conjuntos de caracteres alternativos (pense internacional), provavelmente usará os nomes das classes em vez de.
Referências
fonte
[[:space:]]
não é equivalente ao[ \t]
caso geral (unicode, etc).[[:space:]]
provavelmente será muito mais lento (pois há muito mais tipos de espaços em branco no unicode do que just' '
e'\t'
). A mesma coisa para todos os outros.sed 's/^[ \t]*//'
não é portátil. Na verdade, o POSIX ainda exige que remova uma sequência de espaço, barra invertida out
caracteres, e é isso que o GNUsed
também faz quandoPOSIXLY_CORRECT
está no ambiente.sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//'
Conforme sugerido por Stéphane Chazelas na resposta aceita, agora você pode
criar um script
/usr/local/bin/trim
:e conceda direitos executáveis a esse arquivo:
Agora você pode passar todas as saídas para,
trim
por exemplo:(para os comentários abaixo: eu usei isso antes: o
while read i; do echo "$i"; done
que também funciona bem, mas tem menos desempenho)
fonte
while read -r line
para preservar barras invertidas e mesmo assim ... . Quanto aos enormes arquivos / velocidade, realmente, você escolheu a pior solução. Eu não acho que haja algo pior por aí. Veja as respostas em Por que está usando um loop de shell para processar práticas inadequadas de texto? incluindo meu comentário sobre a última resposta em que adicionei um link a um benchmark de velocidade. Assed
respostas aqui são perfeitamente bem IMO e muito melhor queread
.-
e seguidas por combinações de 1 ou mais caracteres e, E ou n e / ou contém caracteres NUL. Além disso, uma linha não terminada após a última nova linha será ignorada.xargs sem argumentos fazem isso.
Exemplo:
fonte
xargs
falhará na entrega se a entrada contiver barras invertidas e aspas simples.echo
invocações. Algumas implementações de eco também processam opções e / ou barras invertidas ... Isso também funciona apenas para entrada de linha única.Se você está lendo uma linha em uma variável shell,
read
isso já é feito, a menos que seja instruído de outra forma .fonte
read
. Então, se você tubo para enquanto lê-lo funciona:cat file | while read i; do echo $i; done
echo "$i"
para ver o verdadeiro efeito doread
Se você armazenar linhas como variáveis, poderá usar o bash para fazer o trabalho:
remova o espaço em branco à esquerda de uma sequência:
remova o espaço em branco à direita de uma string:
remova todo o espaço em branco de uma string:
fonte
Para remover todos os espaços iniciais e finais de uma determinada linha, graças a uma ferramenta 'encanada', posso identificar três maneiras 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, vamos considerar esta linha de entrada fictícia:
tr
tr
é realmente um comando simples. Nesse caso, ele exclui qualquer caractere de espaço ou tabulação.awk
awk
exclui os espaços iniciais e finais e pressiona em um único espaço todos os espaços entre as palavras.sed
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.fonte
[:space:]
, em vez de [: blank:], para o comandotr
, como :,... | tr -d [:space:]
para remover novas linhas também. (ver:man tr
)O sed é uma ótima ferramenta para isso:
Você pode usá-lo para o seu caso, seja no texto, por exemplo,
ou agindo de forma 'inline' se você
sed
é o GNU:mas alterar a fonte dessa maneira é "perigoso", pois pode ser irrecuperável quando não funciona direito (ou mesmo quando funciona!), portanto faça o backup primeiro (ou o uso
-i.bak
que também tem o benefício de ser portátil para alguns BSDssed
) !fonte
comando translate funcionaria
fonte
Se a string que está tentando aparar for curta e contínua / contígua, pode-se simplesmente passá-la como parâmetro para qualquer função bash:
fonte