Supondo que você queira remover todos espaços e novas linhas, não apenas a última nova linha, você pode usar tr
:
tr -d '[[:space:]]' < file > file.trimmed
Ou, mais precisamente:
tr -d '\t\n ' < file > file.trimmed
Eu quero remover todos os caracteres "em branco" desde o início e até o final de um arquivo de texto, incluindo \ n se existir. (basicamente imitando o comportamento da função trim () da maioria das linguagens de programação, se o "arquivo" for uma string grande).
Supondo que você queira remover todos espaços e novas linhas, não apenas a última nova linha, você pode usar tr
:
tr -d '[[:space:]]' < file > file.trimmed
Ou, mais precisamente:
tr -d '\t\n ' < file > file.trimmed
Em awk
:
{ isblank = 0 }
/^[[:blank:]]*$/ { isblank = 1 }
state == 0 && isblank { next }
state == 0 && !isblank { state = 1 }
state == 1 && isblank { buffer[++n] = $0 }
state == 1 && !isblank { for (i = 1; i <= n; ++i) print buffer[i]; n = 0; print }
state
indica em que estado o programa se encontra. Quando state == 0
, o programa removerá qualquer linha em branco. Uma linha em branco é uma linha vazia ou que contém apenas espaços ou tabulações (que é o que corresponde a [[:blank:]]
). O programa permanece em state == 0
até que uma linha não vazia seja encontrada. Isso reduz o início do arquivo.
Quando state == 1
, o programa salvará linhas em branco na matriz buffer
. Essas linhas em branco precisam ser exibidas assim que uma linha não vazia for encontrada. Se nenhuma linha não vazia for encontrada, elas serão descartadas (isso corta o final do arquivo).
O efeito geral é que as linhas em branco no início e no final do arquivo são removidas, enquanto as linhas em branco em outro lugar são preservadas (incluindo seus espaços ou tabulações, se contiverem estas no arquivo original).
Teste:
$ cat file
Three blank lines above
Two blank lines in the middle
Three blank lines below
$ awk -f trim.awk file
Three blank lines above
Two blank lines in the middle
Three blank lines below
O programa não modifica espaços em branco no início da primeira linha não vazia nem no final da última linha não vazia. Se isso for necessário, pode-se usar
$ awk -f trim.awk file | sed -e '1s/^[[:blank:]]*//' -e '$s/[[:blank:]]*$/'
Supondo que você queira remover espaços em branco iniciais / finais para cada linha e não o arquivo como um todo.
Um arquivo de teste, em que algumas linhas têm espaços em branco à esquerda ou à direita e linhas em branco:
$ cat -e file
line 1$
line 2$
line 3 has trailing spaces $
$
blank line above$
E um comando GNU sed para fazer o recorte
$ sed -r 's/^\s+//; s/\s+$//; /^$/d' file | cat -e
line 1$
line 2$
line 3 has trailing spaces$
blank line above$
Bem, não script shell, mas eu escrevi uma solução PHP:
nome do script: trimfile.php
<?php
if ( (!empty($argv[1])) && (file_exists($argv[1])) ) {
$file_contents = file_get_contents($argv[1]);
$new_file_contents = trim($file_contents) . "\n";
if ($file_contents <> $new_file_contents) {
file_put_contents($argv[1], $new_file_contents);
}
}
?>
Uso:
$ php trimfile.php yourfile.txt
Você pode tentar com o ed que infelizmente não veio na instalação padrão do debian.
printf '%s\n' \
'g/[^[:blank:]][^[:blank:]]*/kx' \
"'"'x,$j' \
'$s/[[:blank:]]*$//' \
'/[^[:blank:]][^[:blank:]]*/kx' \
'1,'"'"'xj' \
'1s/^[[:blank:]]*//' \
'wq' |
ed -s infile
Ou com o gnu sed
sed -Ezi 's/^\s+|\s+$//g;s/$/\n/' infile
Use sed
:
sed -z 's/^\s*//; s/\s*$//' infile
s/^\s*//
, exclui espaços em branco / linhas vazias ao simples pedido do infile
como arquivo de entrada.
s/\s*$//
, espaços em branco excluídos / linhas vazias no final do infile
como um arquivo de entrada, incluindo \n
no final de infile
.
Exemplo cat -e infile
:
$
$
$
Three blank lines above$
$
$
Two blank lines in the middle$
a blank lines below$
$
a line with trailing whitespaces $
a line with leading whitespaces$
below are two empty lines + one whitespaces then an empty line again$
$
$
$
$
A saída:
Three blank lines above
Two blank lines in the middle
a blank lines below
a line with trailing whitespaces
a line with leading whitespaces
below are two empty lines + one whitespaces then an empty line again
Ou você pode usar printf
para imprimir o resultado de sed
que removeu os primeiros espaços em branco / linhas vazias e usou-o na substituição de comando que exclui linhas vazias apenas no final e \n
.
printf '%s' "$(sed -z 's/^\s*//' infile)"