Eu usaria perl
para introduzir o arquivo na memória e remover qualquer espaço em branco se e somente se o primeiro caractere que não é espaço em branco no arquivo for um shebang:
perl -i.bak -0pe 's/^\s+(?=#!)//' file
Ou, para muitos arquivos:
for f in ./*; do perl -i.bak -0pe 's/^\s+(?=#!)//' "$f"; done
O (?=#!)
é lookahead positivo , portanto, o operador de substituição só removerá o espaço em branco (incluindo novas linhas e tabs) desde o início do arquivo que são seguidos por um #!
. O -i.bak
garante que você mantenha backups de todos os arquivos modificados, apenas no caso. Se tiver certeza de que funciona como esperado, você pode rm *.bak
.
As opções perl
usadas aqui são:
-
-0
: especifica o separador de registro de entrada ($/
) como um número octal ou hexadecimal. Usar-0
por si só fazperl
fazer slurp no arquivo e basicamente tratá-lo como uma única linha. *-i.bak
: edite o arquivoi
nplace e crie um backup do original com a extensão.bak
. -
-p
: processa um arquivo de entrada linha por linha e imprime cada linha depois de aplicar o script fornecido por-e
. -
-e
: passa um script para ser executado como um parâmetro de linha de comando.