3

У меня есть большое количество файлов с определенным отступом, и я хочу преобразовать их в другой стиль (они имеют 4 пробела, и я хочу, чтобы они использовали 2 пробела). Как я могу автоматически настроить отступ для большого набора файлов (желательно с указанием списка файлов, поскольку этот размер вкладки имеет только файл с определенным расширением).

Я использую Windows, но у меня есть доступ к компьютерам с Linux и у меня установлен Cygwin.

Для чего это стоит, у меня очень чистый и последовательный отступ. Однако это не так просто, как заменить 4 пробела на 2, поскольку мы хотим заменить только начальные пробелы.

2 ответа2

3

Следующий однострочник:

perl -ne '$_ =~ s|^((    )+)|"  " x (length($1)/4)|eg; print $_' < test.txt

Заменяет отступ с 4 пробелами на отступ с 2 пробелами.

(Вы можете проверить, заменив " " на "-+" чтобы увидеть сгенерированный шаблон)

Теперь мы можем создать файл bash, назовем его indent-changer.sh:

#!/bin/bash
while read filename; do
    if ! [[ -r "$filename" ]]; then
        echo "Skipping '$filename' because not readable"
        continue
    fi
    tempfile="$(mktemp)"
    if perl -ne '$_ =~ s|^((    )+)|"  " x (length($1)/4)|eg; print $_' < "$filename" > "$tempfile"; then
        mv "$filename" "$filename".orig
        mv "$tempfile" "$filename"
        echo "Success processing '$filename'"
    else
        echo "Failure processing '$filename'"
    fi
done < "$1"

Скопируйте список файлов для обработки в файл и выполните приведенный выше скрипт. Исходный файл все еще существует с добавлением суффикса .orig . Так, например:

find . -type f -iname "*.txt" > files-to-process.lst
# Verify or edit the .lst file as needed
./indent-changer.sh files-to-process.lst > processing.log

Вы можете легко проверить сбои processing.log, выполнив egrep -v '^Success' processing.log .


PS: я тестировал однострочник (но не скрипт bash) на моей установке Cygwin; Я не помню, является ли perl частью первоначальной установки или добавлен позже. Но я думаю, что это часть оригинальной установки.

Тестирование шаблона "-+" с помощью следующего файла:

THis is a test file
    With indentation
        more indentation
        plus    internal spaces
    outdent
        indent again
        another    internal space example
          two spaces after two indents
        end
    end
end

Результаты в:

THis is a test file
-+With indentation
-+-+more indentation
-+-+plus    internal spaces
-+outdent
-+-+indent again
-+-+another    internal space example
-+-+  two spaces after two indents
-+-+end
-+end
end

Редактировать 2: Вот более общая версия Perl с одной строкой:

perl -ne '$f="    ";$t="  ";$_=~s|^(($f)+)|$t x (length($1)/length($f))|eg; print $_' < test.txt

В этой версии просто отредактируйте определения для $f и $t мере необходимости.

2

Самым простым способом, который я могу придумать, является использование unexpand и expand , в зависимости от используемой системы, следующая команда (работает в Arch Linux) может работать или не работать (эта команда в OS X и Arch Linux имеет другой набор аргументов. Обратитесь к своему man unexpand а man expand для подробного использования.),

unexpand  -t 4 --first-only [your_file] > [temp]
expand -i -t 2 [temp] > [output]

Первая команда заменяет все начальные отступы в 4 пробела в [your_file] на вкладки, результат сохраняется как [temp] . Вторая команда заменяет все ведущие вкладки в [temp] на группы из 2 пробелов, выходные данные - [output] .

Конечно, вы также можете передать его в более короткую форму

unexpand --first-only -t 4 [your_file] | expand -i -t 2 > [output]

Чтобы изменить отступ для большого количества файлов, вы можете написать небольшой файл сценария, example.sh

FILES=/path/to/*.[your_suffix]
OLD_LENGTH=4        # old indentation length
NEW_LENGTH=2        # new indentation length
for f in $FILES; do
  unexpand --first-only -t $OLD_LENGTH f | expand -i -t $NEW_LENGTH > f
done

Вызывая

sh ./example.sh

Вы измените отступ всех файлов, удовлетворяющих шаблону /path/to/*.[your_suffix] .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .