Respostas:
Tente o seguinte:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
Se você quiser quatro espaços, tente:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
's/\t/ /g'
substituir mais do que apenas uma guia por linha.
find ./ -type f -exec sed -i ’s/\t/ /g’ {} +
" (ou seja, " +
" em vez de " \;
")), se a find
versão suportar (e eu não conheci pessoalmente nenhuma versão que não suporta, mas não é um padrão POSIX , então acho que isso pode acontecer em alguns sistemas. " -exec command {} +
" Consulte o manual). Em vez de iniciar uma instância de sed
para cada arquivo, isso criará uma lista de argumentos com o mesmo número de argumentos de nome de arquivo que o sistema suporta ( getconf ARG_MAX
= 2097152 no meu sistema), assim como xargs
e, portanto, iniciará muito menos sed
processos.
sed
não entende a \t
sequência de escape da guia. Você pode substituí-lo por um caractere de tabulação literal, no qual você pode inserir no shell [Ctrl]+V, [Tab]
.
expand
é provavelmente melhor do que sed
para isso, como explicado em: stackoverflow.com/a/11094620/131824
Existem várias maneiras de fazer isso. Também existem várias maneiras de dar um tiro no pé enquanto faz isso se você não for cuidadoso ou se for novo no Linux como parece. Supondo que você possa criar uma lista de arquivos que deseja converter, usando algo parecido find
ou manualmente com um editor, basta canalizar essa lista para o seguinte.
while read file
do
expand "$file" > /tmp/expandtmp
mv /tmp/expandtmp "$file"
done
Uma maneira de dar um tiro no pé com isso é digitar um erro de digitação, criando um arquivo vazio para todos os nomes de arquivo especificados, excluindo assim o conteúdo de todos os seus arquivos. Portanto, tenha cuidado e teste o que você faz primeiro em um pequeno conjunto de arquivos dos quais você fez backup.
mv
condicional no sucesso de expand
:expand ... && mv ...
expand -t 4
de expandir as guias para 4 espaços. Além disso, esse método pode criar novas linhas à direita. Mas, caso contrário, funciona.
find . -type f -iname "*.js" -print0 | xargs -0 -I foo tab2space foo foo
-I foo
cria uma variável de modelo foo para cada linha de entrada, para que você possa consultar a entrada mais de uma vez.
-print0
e -0
diga aos dois comandos para usar \ 0 como um separador de linhas em vez de ESPAÇO, para que esse comando funcione para caminhos com espaços.
Isto é melhor:
find . -name *.java ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
/tmp/e
porque se algo mais estiver usando esse arquivo, isso vai atrapalhar. Como se dois usuários quisessem usar isso ao mesmo tempo.
Dei uma chance a este problema com os seguintes requisitos em mente:
O último requisito foi o mais difícil de cumprir porque "expandir" não permite modificar os arquivos no local.
Eu vim com a seguinte solução:
find . -type f -regextype egrep -regex '.*\.(c|cpp|h|hpp)' -print0 | xargs -0 -n 1 -P 10 -IFILE bash -c ' ( echo "Processing FILE..." && expand -t 4 "FILE" > /tmp/expand.$$ && mv /tmp/expand.$$ "FILE" ) || exit 255'
Aqui está uma explicação:
expand
, presumo que ele deseja que o alinhamento do texto seja preservado.