Ответы:
Попробуйте следующее:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
Если вы хотите четыре пробела, попробуйте:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
's/\t/ /g'заменить более одной вкладки на строку.
find ./ -type f -exec sed -i ’s/\t/ /g’ {} +" (то есть " +" вместо " \;"), если findверсия поддерживает это (и я лично не встречал ни одной версии, которая не делает, но это не стандарт POSIX , поэтому я думаю, что это может произойти в некоторых системах. Смотрите " -exec command {} +" в руководстве). Вместо того, чтобы запускать один экземпляр sedдля каждого файла, это создаст список аргументов с таким количеством аргументов имени файла, которое поддерживает система ( getconf ARG_MAX= 2097152 в моей системе), и xargs, таким образом, запустит гораздо меньше sedпроцессов.
sedне понимает \tescape-последовательность вкладки. Вы можете заменить его буквальным символом табуляции, который вы можете ввести в оболочке [Ctrl]+V, [Tab].
Есть много способов сделать это. Есть также много способов выстрелить себе в ногу, делая это, если вы неосторожны или если вы новичок в Linux, как кажется. Предполагая, что вы можете создать список файлов, которые вы хотите преобразовать, используя что-то подобное findили вручную с редактором, просто передайте этот список в следующий список.
while read file
do
expand "$file" > /tmp/expandtmp
mv /tmp/expandtmp "$file"
done
Один из способов, которым вы можете выстрелить себе в ногу, - это сделать опечатку так, чтобы вы добавили пустой файл ко всем указанным вами именам файлов, тем самым удалив содержимое всех ваших файлов. Поэтому будьте осторожны и тестируйте все, что вы делаете в первую очередь, на небольшом наборе файлов, для которого вы создали резервную копию.
mvусловие успеха expand:expand ... && mv ...
expand -t 4расширить вкладки до 4 пробелов. Кроме того, этот метод может создавать завершающие строки. Но в остальном это работает.
find . -type f -iname "*.js" -print0 | xargs -0 -I foo tab2space foo foo
-I foo создает переменную шаблона foo для каждой строки ввода, поэтому вы можете ссылаться на нее несколько раз.
-print0и -0скажите обеим командам использовать \ 0 в качестве разделителя строк вместо SPACE, чтобы эта команда работала для путей с пробелами.
Это лучше:
find . -name *.java ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
/tmp/eпотому что, если что-то еще использует этот файл, это испортит его. Например, если два пользователя хотели использовать это одновременно.
Я решил эту проблему с учетом следующих требований:
Последнее требование было самым трудным для выполнения, потому что «расширение» не позволяет изменять файлы на месте.
Я придумал следующее решение:
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'
Вот некоторые объяснения:
expand, я предполагаю, что он / она хочет сохранить выравнивание текста.