如何将制表符转换为一个目录的每个文件中的空格(可能递归)?

此外,是否有一种方法来设置每个制表符的空格数?


当前回答

将目录下的所有Java文件递归转换为4个空格而不是制表符:

find . -type f -name *.java -exec bash -c 'expand -t 4 {} > /tmp/stuff;mv /tmp/stuff {}' \;

其他回答

没有人提到rpl?使用rpl可以替换任何字符串。 要将制表符转换为空格,

rpl -R -e "\t" "    "  .

非常简单。

警告:这会破坏你的回购。 这将破坏二进制文件,包括那些在svn, .git!使用前请阅读评论!

找到。-iname '*.java' -type f -exec sed -i。/\t/ /g' {} +

原始文件保存为[filename]. trans。

将'*.java'替换为您正在寻找的文件类型的文件结尾。这样可以防止二进制文件的意外损坏。

缺点:

将替换文件中的所有制表符。 如果在这个目录中有一个5GB的SQL转储,将花费很长时间。

对于递归应用程序,我喜欢上面的“find”示例。为了使其具有非递归性,只更改当前目录中匹配通配符的文件,shell glob扩展可以满足少量文件的需求:

ls *.java | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}' | sh -v

如果在您相信它工作之后希望它保持沉默,只需在sh命令的末尾加上-v。

当然,您可以在第一个命令中选择任何一组文件。例如,以受控的方式只列出一个特定的子目录(或多个目录),如下所示:

ls mod/*/*.php | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}' | sh

或者反过来运行find(1)与深度参数等的一些组合:

find mod/ -name '*.php' -mindepth 1 -maxdepth 2 | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}' | sh

使用反斜杠转义sed。

在linux上:

将所有*.txt文件中的所有制表符替换为1个连字符: Sed -i $'s/\t/-/g' *.txt 将所有*.txt文件中的所有制表符替换为1个空格: Sed -i $'s/\t/ /g' *.txt 将所有*.txt文件中的所有制表符替换为4个空格: Sed -i $'s/\t/ /g' *.txt

在mac电脑上:

将所有*.txt文件中的所有制表符替换为4个空格: Sed -i " $'s/\t/ /g' *.txt

你可以使用vim:

find -type f \( -name '*.css' -o -name '*.html' -o -name '*.js' -o -name '*.php' \) -execdir vim -c retab -c wq {} \;

正如Carpetsmoker所说,它将根据你的vim设置重新标签。文件中的modeline(如果有的话)。此外,它不仅将替换行首的制表符。这通常不是你想要的。例如,你可能有文字,包含制表符。