如何批量更改缩进大小

如何批量更改缩进大小

我有大量以特定方式缩进的文件,我想将它们转换为不同的缩进样式(它们缩进 4 个空格,我希望它们使用 2 个空格)。如何才能自动调整大量文件的缩进(最好给出文件列表,因为只有具有特定扩展名的文件才具有此制表符大小)。

我使用的是 Windows,但可以访问 Linux 机器并安装了 Cygwin。

不管怎样,我的缩进非常干净和一致。不过,这并不像用 2 个空格替换 4 个空格那么简单,因为我们只想替换前导空格。

答案1

以下一行:

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


附言:我在 Cygwin 安装中测试了单行代码(但不是 bash 脚本);我不记得它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

我能想到的最简单的方法是使用unexpandexpand,根据您使用的系统,以下命令(在 Arch Linux 中有效)可能会或可能不会起作用(此命令在 OS X 和 Arch Linux 中具有不同的参数设置。请参考您自己的man unexpandman 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]

相关内容