для визуального пространства, представляющего собой смесь вкладок и пробелов, этот подход дает неверное расширение.
пицца
7
Я также добавил бы средство сопоставления файлов, например, для поиска только файлов .php ./ -iname "* .php" -type f -exec sed -i 's / \ t / / g' {} \;
Даниэль Лука CleanUnicorn
98
НЕ ИСПОЛЬЗУЙТЕ САС! Если в строке есть встроенная вкладка, вы можете изменить код. Вот что должна была обрабатывать команда расширения . Использование expand.
Дэвид У.
5
@DavidW. Я просто обновил бы эту команду, чтобы заменить только вкладки в начале строки. find ./ -type f -exec sed -i 's/^\t/####/g' {} \;, Но я не знал о команде расширения - очень полезно!
Мартин Конечни
29
НЕ ИСПОЛЬЗУЙ! Этот ответ также разрушил мой локальный репозиторий git. Если у вас есть файлы, содержащие смешанные табуляции и пробелы, он вставит последовательность символов #. Вместо этого используйте ответ Джина или комментарий Дожа ниже.
кукла
344
Простая замена sed- это нормально, но не самое лучшее решение. Если между вкладками есть «лишние» пробелы, они все равно останутся после замены, поэтому поля будут неровными. Вкладки, развернутые в середине строк, также не будут работать правильно. В bash, мы можем сказать вместо
применить expandк каждому файлу Java в текущем дереве каталогов. Удалите / замените -nameаргумент, если вы ориентируетесь на некоторые другие типы файлов. Как упоминается в одном из комментариев, будьте очень осторожны при удалении -nameили использовании слабого подстановочного знака. Вы можете легко забить хранилище и другие скрытые файлы без намерения. Вот почему первоначальный ответ включал это:
Вы должны всегда делать резервную копию дерева, прежде чем пытаться что-то подобное на случай, если что-то пойдет не так.
@JeffreyMartinez Отличный вопрос. gniourf_gniourf отредактировал мой первоначальный ответ 11 ноября и сделал пренебрежительные замечания о том, что он не знает, как правильно пользоваться {}. Похоже, он не знал о том, $0когда -cиспользуется. Затем dimo414 изменился с моего использования temp в каталоге преобразования на /tmp, что будет намного медленнее, если он /tmpнаходится в другой точке монтирования. К сожалению, у меня нет Linux-бокса для тестирования вашего $0предложения. Но я думаю, что вы правы.
Джин
1
@Gene, спасибо за разъяснения, это звучит как stackoverflow хорошо: с. Хотя, пока я в этом, добавлю, что для правильного экранирования * .java пришлось использовать кавычки вокруг * .java.
Джеффри Мартинес
2
Если у кого-то возникла ошибка «неизвестный первичный или оператор» из find, то вот полная команда, которая исправит это:find . -name '*.java' ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
Doge
4
Я думал, что в этом ответе недостаточно комментариев, как и было, так что это мое: если использовать use spongeиз joeyh.name/code/moreutils , вы можете написатьfind . -name '*.py' ! -type d -exec bash -c 'expand -t 8 "$0" | sponge "$0"' {} \;
tokland
8
Не будь глупым и используй find . -name '*', я только что уничтожил мой локальный репозиторий
Есть ли преимущество перед тем, expandчто оба являются POSIX? Например, у него есть встроенная опция изменения? Git safety at: stackoverflow.com/a/52136507/895245
Чиро Сантилли 郝海东 '病 六四 事件 法轮功
5
Как я могу преобразовать вкладки в пробелы в каждом файле каталога (возможно, рекурсивно)?
Обычно это не то, что вы хотите.
Вы хотите сделать это для изображений PNG? PDF файлы? Каталог .git? Ваш
Makefile(который требует вкладки)? SQL-дамп 5 Гб
Теоретически вы можете передать множество опций исключения findили что-то еще, что вы используете; но это хрупко, и сломается, как только вы добавите другие двоичные файлы.
То, что вы хотите, это как минимум:
Пропустить файлы определенного размера.
Определите, является ли файл двоичным, проверив наличие байта NULL.
Заменяйте вкладки только в начале файла ( expandделает это, sed
не делает).
Насколько я знаю, не существует "стандартной" утилиты Unix, которая могла бы сделать это, и это не очень легко сделать с однострочником оболочки, поэтому необходим скрипт.
Некоторое время назад я создал небольшой скрипт под названием
sanitize_files, который делает именно это. Также исправлены некоторые другие распространенные вещи, такие как замена \r\nна \n, добавление трейлинга \nи т. Д.
Вы можете найти упрощенный скрипт без дополнительных функций и аргументов командной строки ниже, но я рекомендую использовать вышеописанный скрипт, так как он с большей вероятностью получит исправления ошибок и другие обновления, чем этот пост.
Я также хотел бы отметить, в ответ на некоторые другие ответы здесь, что использование глобализации оболочки не является надежным способом сделать это, потому что рано или поздно у вас будет больше файлов, чем уместится ARG_MAX(в современных В системах Linux это 128k, что может показаться большим, но рано или поздно этого не
достаточно).
#!/usr/bin/env python## http://code.arp242.net/sanitize_files#
import os, re, sys
def is_binary(data):return data.find(b'\000')>=0
def should_ignore(path):
keep =[# VCS systems'.git/','.hg/''.svn/''CVS/',# These files have significant whitespace/tabs, and cannot be edited# safely# TODO: there are probably more of these files..'Makefile','BSDmakefile','GNUmakefile','Gemfile.lock']for k in keep:if'/%s'% k in path:returnTruereturnFalse
def run(files):
indent_find = b'\t'
indent_replace = b' '* indent_width
for f in files:if should_ignore(f):
print('Ignoring %s'% f)continue
try:
size = os.stat(f).st_size
# Unresolvable symlink, just ignore those
except FileNotFoundError as exc:
print('%s is unresolvable, skipping (%s)'%(f, exc))continueif size ==0:continueif size >1024**2:
print("Skipping `%s' because it's over 1MiB"% f)continue
try:
data = open(f,'rb').read()
except (OSError,PermissionError) as exc:
print("Error: Unable to read `%s': %s"%(f, exc))continueif is_binary(data):
print("Skipping `%s' because it looks binary"% f)continue
data = data.split(b'\n')
fixed_indent =Falsefor i, line in enumerate(data):# Fix indentation
repl_count =0while line.startswith(indent_find):
fixed_indent =True
repl_count +=1
line = line.replace(indent_find, b'',1)if repl_count >0:
line = indent_replace * repl_count + line
data = list(filter(lambda x: x is not None, data))
try:
open(f,'wb').write(b'\n'.join(data))
except (OSError,PermissionError) as exc:
print("Error: Unable to write to `%s': %s"%(f, exc))if __name__ =='__main__':
allfiles =[]for root, dirs, files in os.walk(os.getcwd()):for f in files:
p ='%s/%s'%(root, f)if do_add:
allfiles.append(p)
run(allfiles)
Мне нравится пример "найти" выше для рекурсивного приложения. Чтобы адаптировать его к нерекурсивному, изменяя только файлы в текущем каталоге, которые совпадают с подстановочными знаками, расширения оболочки может быть достаточно для небольшого количества файлов:
ls *.java | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}'| sh -v
Если вы хотите, чтобы он молчал после того, как вы уверены, что он работает, просто бросьте команду -von shв конце.
Конечно, вы можете выбрать любой набор файлов в первой команде. Например, перечислите только определенный подкаталог (или каталоги) контролируемым образом, например:
ls mod/*/*.php | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}'| sh
Или, в свою очередь, запустите find (1) с некоторой комбинацией параметров глубины и т.д .:
Глобализация оболочки рано или поздно прекратится, потому что общее количество имен файлов может быть только ARG_MAXдлины. Это 128 КБ в системах Linux, но я сталкивался с этим ограничением достаточно раз, чтобы не полагаться на глобализацию оболочки.
Мартин Турной
1
Вам не нужно адаптировать их. findможно сказать -maxdepth 1, и он обрабатывает только записи изменяемого каталога, а не все дерево.
ShadowRanger
4
Я использовал astyleдля повторного отступа весь мой код C / C ++ после нахождения смешанных символов табуляции и пробелов. Он также имеет опции для принудительного использования определенного стиля скобок, если хотите.
Как заявил Carpetsmoker, он будет перезагружен в соответствии с вашими vimнастройками. И модели в файлах, если есть. Также он заменит вкладки не только в начале строк. Что не то, что вы обычно хотите. Например, у вас могут быть литералы, содержащие вкладки.
:retabизменит все вкладки в файле, а не те, что в начале. это также зависит от ваших настроек :tabstopи :expandtabнастроек в vimrc или modeline, так что это может вообще не работать.
Мартин Турной
@Carpetsmoker Хорошее замечание о вкладках в начале строк. Любое из решений здесь обрабатывает этот случай? Что же касается tabstopи expandtabнастроек, он будет работать, если вы используете vim. Если у вас нет строк режима в файлах.
x-yuri
@ х-юри хороший вопрос, но вообще спорный. Большинство людей используют не настоящие вкладки в литералах.
Рикардо Крус
4
Я рекомендую использовать:
find .-name '*.lua'-exec ex '+%s/\t/ /g'-cwq {} \;
Комментарии:
Используйте в месте редактирования. Храните резервные копии в VCS. Нет необходимости создавать * .orig файлы. Хорошей практикой является сравнение результата с последним коммитом, чтобы убедиться, что в любом случае это сработало так, как ожидалось.
sedпотоковый редактор Используйте exдля редактирования на месте. Это позволяет избежать создания дополнительных временных файлов и порождать оболочки для каждой замены, как показано в верхнем ответе .
ВНИМАНИЕ: Это портит все вкладки, а не только те, которые используются для отступа. Также он не делает контекстную замену вкладок. Этого было достаточно для моего варианта использования. Но не может быть приемлемым для вас.
РЕДАКТИРОВАТЬ: более ранняя версия этого ответа используется find|xargsвместо find -exec. Как указывает @ gniourf-gniourf, это приводит к проблемам с пробелами, кавычками и контрольными символами в именах файлов cf. Уилер .
exможет быть недоступно в каждой системе Unix. Замена его vi -eможет работать на большем количестве машин. Кроме того, ваше регулярное выражение заменяет любое количество начальных символов табуляции двумя пробелами. Замените регулярное выражение, +%s/\t/ /gчтобы не разрушать многоуровневый отступ. Однако это также влияет на символы табуляции, которые не используются для отступа.
Лукас Шмельцайзен
ex является частью POSIX [1], поэтому должен быть доступен. Хороший вопрос о многоуровневой индендации. Я на самом деле использовал /\t/ /вариант в моих файлах, но решил /\t\+//не ломать вкладки без отступов. Пропустил проблемы с несколькими отступами! Обновление ответа. [1] man7.org/linux/man-pages/man1/ex.1p.html#SEE%C2%A0ALSO
Генрих Хартманн
2
Использование xargsтаким способом бесполезно, неэффективно и неэффективно (представьте имена файлов, содержащие пробелы или кавычки). Почему бы вам не использовать find«s -execпереключатель вместо этого?
gniourf_gniourf
Я бы сказал, что имена файлов с пробелами и кавычками не работают; ) Если вам нужна поддержка, я бы выбрал: -print0опции для поиска / xargs. Мне больше нравится xargs, -execтак как: а) разделение проблем; б) его можно поменять местами с помощью параллельной GNU.
Чем этот ответ отличается от того, который был опубликован 4 года назад?
PP
2
Так же как и ваш ответ. На самом деле, это плохая версия ответа Джина: 1) Ответ Джина позаботится о каталогах с тем же именем. 2) Он не двигается, если расширение не удалось.
PP
4
Вы можете использовать findс tabs-to-spacesпакетом для этого.
Сначала установите tabs-to-spaces
npm install -g tabs-to-spaces
затем запустите эту команду из корневого каталога вашего проекта;
find .-name '*'-exec t2s --spaces 2{} \;
Это заменит каждый tabсимвол с 2 spacesв каждом файле.
Отличная команда, но потенциально опасная для рекурсивных и всех файлов в папке, как указано выше. Я бы добавил параметр --dry-run «на всякий случай», чтобы убедиться, что вы находитесь в правильной папке.
MortimerCat
2
Использование, expandкак предлагается в других ответах, кажется наиболее логичным подходом для одной только этой задачи.
Тем не менее, это также может быть сделано с Bash и Awk на случай, если вы захотите сделать некоторые другие модификации вместе с ним.
Если вы используете Bash 4.0 или выше, встроенный модуль shoptglobstar может использоваться для рекурсивного поиска **.
С помощью GNU Awk версии 4.1 или выше можно внести изменения, подобные файлам «inplace»:
Очевидно, что объем пространства, на которое расширяется вкладка, зависит от контекста. Таким образом, sed - совершенно неподходящий инструмент для этой задачи.
Свен
?? @ Свен, моя команда sed делает то же самое, что и команда расширения ( expand -t 4 input >output)
Маках
3
Конечно нет. expand -t 4развернет вкладку a\tbдо 3 пробелов и вкладку aa\tbдо 2 пробелов, как и должно быть. expandучитывает контекст вкладки, sedне изменяет и заменяет вкладку количеством пробелов, указанным вами, независимо от контекста.
Свен
-1
Используйте vim-way:
$ ex +'bufdo retab'-cxa **/*.*
Сделайте резервную копию! перед выполнением вышеуказанной команды, так как она может повредить ваши двоичные файлы.
Чтобы использовать globstar( **) для рекурсии, активируйте с помощью shopt -s globstar.
Чтобы указать конкретный тип файла, используйте, например: **/*.c.
... и все ваши решения будут блокировать двоичные файлы и тому подобное (например, файлы .png, файлы .pdf и т. д.)
Мартин Турной
Откровенно говоря, это ужасное предложение для документации - чтобы понять это, нужно быть близко знакомым с рядом довольно непрозрачных синтаксических и семантических проблем нескольких программ.
pr
это замечательная утилита для этого. Смотрите этот ответ .Ответы:
find . -iname '*.java' -type f -exec sed -i.orig 's/\t/ /g' {} +
Исходный файл сохраняется как
[filename].orig
.Замените '* .java' на конец файла того типа, который вы ищете. Таким образом, вы можете предотвратить случайное повреждение двоичных файлов.
Недостатки:
источник
expand
.find ./ -type f -exec sed -i 's/^\t/####/g' {} \;
, Но я не знал о команде расширения - очень полезно!Простая замена
sed
- это нормально, но не самое лучшее решение. Если между вкладками есть «лишние» пробелы, они все равно останутся после замены, поэтому поля будут неровными. Вкладки, развернутые в середине строк, также не будут работать правильно. Вbash
, мы можем сказать вместоприменить
expand
к каждому файлу Java в текущем дереве каталогов. Удалите / замените-name
аргумент, если вы ориентируетесь на некоторые другие типы файлов. Как упоминается в одном из комментариев, будьте очень осторожны при удалении-name
или использовании слабого подстановочного знака. Вы можете легко забить хранилище и другие скрытые файлы без намерения. Вот почему первоначальный ответ включал это:источник
{}
. Похоже, он не знал о том,$0
когда-c
используется. Затем dimo414 изменился с моего использования temp в каталоге преобразования на/tmp
, что будет намного медленнее, если он/tmp
находится в другой точке монтирования. К сожалению, у меня нет Linux-бокса для тестирования вашего$0
предложения. Но я думаю, что вы правы.find . -name '*.java' ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
sponge
из joeyh.name/code/moreutils , вы можете написатьfind . -name '*.py' ! -type d -exec bash -c 'expand -t 8 "$0" | sponge "$0"' {} \;
find . -name '*'
, я только что уничтожил мой локальный репозиторийПопробуйте инструмент командной строки
expand
.где
-i
используется для расширения только ведущих вкладок в каждой строке;-t 4
означает, что каждая вкладка будет преобразована в 4 символа пробела (по умолчанию 8).sponge
изmoreutils
пакета, и избегает очистки входного файла .Наконец, вы можете использовать
gexpand
на OSX, после установкиcoreutils
с Homebrew (brew install coreutils
).источник
-i
наexpand
замену только ведущих вкладок в каждой строке. Это помогает избежать замены вкладок, которые могут быть частью кода.input
- это тот же файл, чтоoutput
и bash, который забивает содержимое еще до запускаexpand
. Вот как это>
работает.Собирая лучшие комментарии от ответа Гена , лучшее решение на сегодняшний день, является использование
sponge
из moreutils .Объяснение:
./
рекурсивно ищет в текущем каталоге-iname
совпадение без учета регистра (как для лайков, так*.java
и для*.JAVA
лайков)type -f
находит только обычные файлы (без каталогов, двоичных файлов или символических ссылок)-exec bash -c
выполнить следующие команды в подоболочке для каждого имени файла,{}
expand -t 4
расширяет все вкладки до 4 местsponge
впитать стандартный ввод (изexpand
) и записать в файл (тот же) *.ПРИМЕЧАНИЕ : * Простое перенаправление файлов (
> "$0"
) здесь не будет работать, потому что оно слишком быстро перезапишет файл .Преимущество : все исходные права доступа к файлам сохраняются и промежуточные
tmp
файлы не используются.источник
Используйте обратную косую черту
sed
.На Linux:
Замените все вкладки с 1 дефисом во всех файлах * .txt:
Замените все вкладки на 1 пробел на месте, во всех файлах * .txt:
Замените все вкладки с 4 пробелами во всех * .txt файлах:
На маке:
Замените все вкладки с 4 пробелами во всех * .txt файлах:
источник
sed -i '' $'s/\t/ /g' $(find . -name "*.txt")
Вы можете использовать общедоступную
pr
команду (страница руководства здесь ). Например, чтобы преобразовать вкладки в четыре пробела, сделайте это:-t
подавляет заголовки-e=num
расширяет вкладки доnum
пробеловЧтобы рекурсивно преобразовать все файлы в дереве каталогов, пропуская двоичные файлы:
Логика пропуска двоичных файлов взята из этого поста .
НОТА:
источник
expand
что оба являются POSIX? Например, у него есть встроенная опция изменения? Git safety at: stackoverflow.com/a/52136507/895245Обычно это не то, что вы хотите.
Вы хотите сделать это для изображений PNG? PDF файлы? Каталог .git? Ваш
Makefile
(который требует вкладки)? SQL-дамп 5 ГбТеоретически вы можете передать множество опций исключения
find
или что-то еще, что вы используете; но это хрупко, и сломается, как только вы добавите другие двоичные файлы.То, что вы хотите, это как минимум:
expand
делает это,sed
не делает).Насколько я знаю, не существует "стандартной" утилиты Unix, которая могла бы сделать это, и это не очень легко сделать с однострочником оболочки, поэтому необходим скрипт.
Некоторое время назад я создал небольшой скрипт под названием sanitize_files, который делает именно это. Также исправлены некоторые другие распространенные вещи, такие как замена
\r\n
на\n
, добавление трейлинга\n
и т. Д.Вы можете найти упрощенный скрипт без дополнительных функций и аргументов командной строки ниже, но я рекомендую использовать вышеописанный скрипт, так как он с большей вероятностью получит исправления ошибок и другие обновления, чем этот пост.
Я также хотел бы отметить, в ответ на некоторые другие ответы здесь, что использование глобализации оболочки не является надежным способом сделать это, потому что рано или поздно у вас будет больше файлов, чем уместится
ARG_MAX
(в современных В системах Linux это 128k, что может показаться большим, но рано или поздно этого не достаточно).источник
Мне нравится пример "найти" выше для рекурсивного приложения. Чтобы адаптировать его к нерекурсивному, изменяя только файлы в текущем каталоге, которые совпадают с подстановочными знаками, расширения оболочки может быть достаточно для небольшого количества файлов:
Если вы хотите, чтобы он молчал после того, как вы уверены, что он работает, просто бросьте команду
-v
onsh
в конце.Конечно, вы можете выбрать любой набор файлов в первой команде. Например, перечислите только определенный подкаталог (или каталоги) контролируемым образом, например:
Или, в свою очередь, запустите find (1) с некоторой комбинацией параметров глубины и т.д .:
источник
ARG_MAX
длины. Это 128 КБ в системах Linux, но я сталкивался с этим ограничением достаточно раз, чтобы не полагаться на глобализацию оболочки.find
можно сказать-maxdepth 1
, и он обрабатывает только записи изменяемого каталога, а не все дерево.Я использовал
astyle
для повторного отступа весь мой код C / C ++ после нахождения смешанных символов табуляции и пробелов. Он также имеет опции для принудительного использования определенного стиля скобок, если хотите.источник
Для этого можно использовать
vim
:Как заявил Carpetsmoker, он будет перезагружен в соответствии с вашими
vim
настройками. И модели в файлах, если есть. Также он заменит вкладки не только в начале строк. Что не то, что вы обычно хотите. Например, у вас могут быть литералы, содержащие вкладки.источник
:retab
изменит все вкладки в файле, а не те, что в начале. это также зависит от ваших настроек:tabstop
и:expandtab
настроек в vimrc или modeline, так что это может вообще не работать.tabstop
иexpandtab
настроек, он будет работать, если вы используетеvim
. Если у вас нет строк режима в файлах.Я рекомендую использовать:
Комментарии:
sed
потоковый редактор Используйтеex
для редактирования на месте. Это позволяет избежать создания дополнительных временных файлов и порождать оболочки для каждой замены, как показано в верхнем ответе .find|xargs
вместоfind -exec
. Как указывает @ gniourf-gniourf, это приводит к проблемам с пробелами, кавычками и контрольными символами в именах файлов cf. Уилер .источник
ex
может быть недоступно в каждой системе Unix. Замена егоvi -e
может работать на большем количестве машин. Кроме того, ваше регулярное выражение заменяет любое количество начальных символов табуляции двумя пробелами. Замените регулярное выражение,+%s/\t/ /g
чтобы не разрушать многоуровневый отступ. Однако это также влияет на символы табуляции, которые не используются для отступа./\t/ /
вариант в моих файлах, но решил/\t\+//
не ломать вкладки без отступов. Пропустил проблемы с несколькими отступами! Обновление ответа. [1] man7.org/linux/man-pages/man1/ex.1p.html#SEE%C2%A0ALSOxargs
таким способом бесполезно, неэффективно и неэффективно (представьте имена файлов, содержащие пробелы или кавычки). Почему бы вам не использоватьfind
«s-exec
переключатель вместо этого?-print0
опции для поиска / xargs. Мне больше нравится xargs,-exec
так как: а) разделение проблем; б) его можно поменять местами с помощью параллельной GNU.Чтобы рекурсивно преобразовать все файлы Java в каталоге, чтобы использовать 4 пробела вместо вкладки:
источник
Вы можете использовать
find
сtabs-to-spaces
пакетом для этого.Сначала установите
tabs-to-spaces
затем запустите эту команду из корневого каталога вашего проекта;
Это заменит каждый
tab
символ с 2spaces
в каждом файле.источник
Тело не упомянуто
rpl
? Используя rpl вы можете заменить любую строку. Чтобы преобразовать вкладки в пробелы,очень просто.
источник
Использование,
expand
как предлагается в других ответах, кажется наиболее логичным подходом для одной только этой задачи.Тем не менее, это также может быть сделано с Bash и Awk на случай, если вы захотите сделать некоторые другие модификации вместе с ним.
Если вы используете Bash 4.0 или выше, встроенный модуль shopt
globstar
может использоваться для рекурсивного поиска**
.С помощью GNU Awk версии 4.1 или выше можно внести изменения, подобные файлам «inplace»:
Если вы хотите установить количество пробелов на вкладке:
источник
Загрузите и запустите следующий сценарий для рекурсивного преобразования жестких вкладок в программные вкладки в текстовых файлах.
Выполните сценарий из папки, которая содержит текстовые файлы.
источник
Git репозиторий дружественный метод
Действовать на все файлы в текущем каталоге:
Действовать только для файлов C или C ++:
Вы, вероятно, хотите этого особенно из-за тех раздражающих Makefiles, которые требуют вкладок.
Команда
git grep --cached -Il ''
:.git
как объяснено на: Как перечислить все текстовые (недвоичные) файлы в репозитории git?
chmod --reference
оставляет права доступа к файлу без изменений: /unix/20645/clone-ownership-and-permissions-from-another-file К сожалению, я не могу найти краткую альтернативу POSIX .Если ваша кодовая база имела безумную идею разрешить функциональные необработанные вкладки в строках, используйте:
и затем получайте удовольствие, просматривая все незапуски линейных вкладок одну за другой, с помощью которых вы можете перечислить: Возможно ли использовать git grep для вкладок?
Проверено на Ubuntu 18.04.
источник
Преобразование вкладок в пробелы только в файлах ".lua" [вкладки -> 2 пробела]
источник
expand -t 4 input >output
)expand -t 4
развернет вкладкуa\tb
до 3 пробелов и вкладкуaa\tb
до 2 пробелов, как и должно быть.expand
учитывает контекст вкладки,sed
не изменяет и заменяет вкладку количеством пробелов, указанным вами, независимо от контекста.Используйте vim-way:
globstar
(**
) для рекурсии, активируйте с помощьюshopt -s globstar
.**/*.c
.Чтобы изменить вкладку, добавьте
+'set ts=2'
.Однако недостатком является то, что он может заменить вкладки внутри строк .
Так что для немного лучшего решения (используя замену), попробуйте:
Или используя
ex
редактор +expand
утилиту:О конечных пробелах см .: Как удалить конечные пробелы для нескольких файлов?
Вы можете добавить следующую функцию в свой
.bash_profile
:источник
:retab
может не работать вообще , глобализация оболочки - плохое решение для такого рода вещей , ваша:s
команда заменит любое количество вкладок двумя пробелами (которые вы почти никогда не хочу), начинать бывшего просто чтобы запустить:!expand
процесс глупо ...