Следующий однострочник:
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
мере необходимости.