Eu tenho um script de shell simples que remove o espaço em branco à direita de um arquivo. Existe alguma maneira de tornar este script mais compacto (sem criar um arquivo temporário)?
sed 's/[ \t]*$//' $1 > $1__.tmp
cat $1__.tmp > $1
rm $1__.tmp
sed
whitespace
Viktor
fonte
fonte
mv
vez decat
erm
. Por que você está usandocat
assim? Por que não usarcp
?cat
para sobrescrever o arquivo original em vez demv
realmente substituir os dados do arquivo original (ou seja, não quebrará os links físicos). Usarsed -i
como proposto em muitas soluções não fará isso. IOW, continue fazendo o que está fazendo.Respostas:
Você pode usar a opção local
-i
desed
para Linux e Unix:Esteja ciente de que a expressão excluirá trailing
t
's no OSX (você pode usargsed
para evitar esse problema). Ele também pode excluí-los do BSD.Se você não tiver gsed, aqui está a sintaxe sed correta (mas difícil de ler) no OSX:
Três strings entre aspas simples se tornam concatenadas em um único argumento / expressão. Não há operador de concatenação no bash, você apenas coloca as strings uma após a outra, sem espaço entre elas.
O é
$'\t'
resolvido como um caractere de tabulação literal em bash (usando aspas ANSI-C ), portanto, a tabulação é concatenada corretamente na expressão.fonte
sed: Not a recognized flag: i
t
:)\t
é uma guia, para quem ainda não sabe.Pelo menos em Mountain Lion, a resposta de Viktor também removerá o caractere 't' quando estiver no final de uma linha. O seguinte corrige esse problema:
fonte
-E
indicação de "expressões regulares estendidas (modernas)"sed
em El Capitan não.Obrigado ao codaddict por sugerir a
-i
opção.O seguinte comando resolve o problema no Snow Leopard
fonte
\t
com o sed diferente do GNU sed e ele é interpretado como uma letra literalt
. O comando apenas parece funcionar, provavelmente porque não há TABs no espaço em branco à direita nem at
no final de uma frase em seu arquivo. Usar''
sem especificar um sufixo de backup não é recomendado.É melhor também citar $ 1:
fonte
fonte
Eu tenho um script em meu .bashrc que funciona em OSX e Linux (apenas bash!)
ao qual acrescento:
fonte
Para quem busca eficiência (muitos arquivos para processar ou arquivos enormes), usar o
+
operador de repetição em vez de*
torna o comando mais do que duas vezes mais rápido.Com GNU sed:
Eu também fiz um benchmarking rapidamente de outra coisa: usar em
[ \t]
vez de[[:space:]]
também acelera significativamente o processo (GNU sed v4.4):fonte
Apenas por diversão:
fonte
No caso específico de
sed
, a-i
opção que outros já mencionaram é de longe a mais simples e sã.No caso mais geral
sponge
, a partir damoreutils
coleção, faz exatamente o que você deseja: permite substituir um arquivo pelo resultado do processamento, de uma forma especificamente projetada para evitar que a etapa de processamento tropece em si mesma, sobrescrevendo o próprio arquivo que está trabalhando em. Para citar asponge
página de manual:https://joeyh.name/code/moreutils/
fonte
Para retirar apenas os espaços em branco (no meu caso, espaços e tabulações) das linhas com pelo menos um caractere diferente de espaço em branco (desta forma, as linhas recuadas vazias não são tocadas):
fonte