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 findversã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 sedpara 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 xargse, portanto, iniciará muito menos sedprocessos.
sednão entende a \tsequê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 sedpara 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 findou 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.
mvcondicional no sucesso de expand:expand ... && mv ...
expand -t 4de 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.
-print0e -0diga 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/eporque 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.