Есть ли способ изменить все вкладки на пробелы для всех файлов в каталоге, используя bash? - PullRequest
1 голос
/ 25 июня 2019

Я только что унаследовал новый проект C ++, в котором множество файлов имеют отступы, а более свежие - с пробелами. Теперь я хочу изменить их все на использование только пробелов. Вместо того, чтобы заходить в каждый файл и использовать функцию авто-отступа EMacs, есть ли более эффективный способ, которым я мог бы добиться этого с помощью bash?

Ответы [ 3 ]

1 голос
/ 25 июня 2019

При использовании любого решения, использующего find, нужно подумать обо всех возможных расширениях имен файлов, глядя на руководство GCC , их много.

Ack имеет очень хорошую опцию выбора файла, просто передайте --cc в качестве параметра, чтобы соответствовать только файлам C ++.

Итак, замените все вкладки во всех файлах C ++, включая заголовочные файлы:

ack --cpp -l --print0 . | xargs -0 -n1 sed -i -e 's/\t/    /' 

ack рекурсивно найдет все файлы C ++ в текущем каталоге и передаст sed только имена файлов, что заменяет все вкладки четырьмя пробелами.

1 голос
/ 26 июня 2019

Это будет рекурсивно проходить по файлам проекта и расширять вкладки до пробелов. Поскольку я уверен, что вы используете систему контроля версий, вы можете легко вернуться, если что-то пойдет не так.

find /path/to/project -type f -name '*.cpp' -exec expand --initial {} +

По умолчанию используется восемь пробелов, но вы можете использовать --tabs=4 или любое другое значение.

Опция --initial игнорирует вкладки, которые следуют без пробелов.

1 голос
/ 25 июня 2019

У меня есть два ответа.Во-первых, чтобы ответить на ваш конкретный вопрос, я бы использовал perl или подобное, например:

replace-tab-indents.pl

#!/usr/bin/perl

while ($line = <STDIN>) {
    while ($line =~ /^ *\t/) {
        $line =~ s/^( *)\t/$1    /;
    }

    print(STDOUT $line);
}

Thisимеет дело с только табуляциями в начале строки .Это очень важно для вашего варианта использования, потому что вы не хотите заменять другие вкладки;например, те, которые являются частью некоторой статической строки в коде.

Используйте это внутри сценария оболочки, например:

for FILE in `find . -name *.cpp`; do
    mv -i "$FILE" "$FILE.bak"
    cat "$FILE.bak" | replace-tab-indents.pl > "$FILE"
done

Использование опции -name в find ограничивает вас только вашими исходными файлами, избегая проблем, которые вы правильно опасаетесь, связанных с заменой всех вкладок во всех файлах - во многих не исходных файлах байт «TAB» имеет решающее значение для данных, которые содержат этот файл.

Мой второй ответ - просто поменять их по ходу, а не все сразу.

Таким образом, вы можете использовать emacs (или vim, или любой современный редактор).действительно), который будет более проверенным, проверенным и надежным подходом.

Файлы прекрасно компилируются с помощью TAB, поэтому до тех пор, пока вам не понадобится редактировать данный файл, наличие отступа TABне влияет на вас;ровно в тот момент, когда он влияет на вас (т. е. при первом редактировании), вы можете использовать редактор для повторного отступа пробелов.Короче говоря, мой совет здесь заключается в том, чтобы выполнить это точно в срок / по ходу дела, а не все сразу.

Иначе говоря, компилятор не заботится об отступе, только выделать;и единственный раз, когда вы будете заботиться, это когда вы на самом деле редактируете данный исходный файл;таким образом, нет никакой эмпирической выгоды от повторного отступа ваших исходных файлов en mass .

...