Відповіді:
Спробуйте наступне:
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
не розуміє \t
послідовність виходу на вкладку. Ви можете замінити його буквальним символом вкладки, який ви можете ввести в оболонку [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
, я припускаю, що він / він хоче, щоб вирівнювання тексту було збережене.