我有大量以特定方式缩进的文件,我想将它们转换为不同的缩进样式(它们缩进 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
我能想到的最简单的方法是使用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]
。