使用Linux中的常用工具实现此目的的最简单方法是什么?
我看过:
sed
,但不太了解如何计算sed -i 's/^[\t]*/<what-to-put-here?>/g myFile.c
等表达式中匹配的主要标签。astyle
,但无法弄清楚如何告诉它只是重新投入而不是格式indent
,与astyle相同的问题expand
,但它也取代了非主要标签,我必须自己处理内部替换,这很容易出错。我只是在寻找一种快速简便的解决方案,我可以插入find -type f -name "*.c" -exec '<tabs-to-spaces-cmd> {}' \;
答案 0 :(得分:4)
你应该真正使用expand
,因为它的开发只是为了做到这一点。来自documentation:
-i, --initial do not convert tabs after non blanks
所以单个文件的命令是:
expand -i -t 4 input > output
要将它与多个文件一起使用,您需要一个技巧:
expand_f () {
expand -i -t 4 "$1" > "$1.tmp"
mv "$1.tmp" "$1"
}
export -f expand_f
find -type f -iname '*.c' -exec bash -c 'expand_f {}' \;
这用于阻止expand
在文件处理时写入文件,并避免重定向find
的标准输出而不是expand
的标准输出。
答案 1 :(得分:2)
这可能适合你(GNU sed):
sed -ri ':a;s/^( *)\t/\1 /;ta' file
答案 2 :(得分:0)
对于单个命令行,您可以像其他答案描述的那样使用expand -i
,但是可以使用find命令自动执行该过程:
find ... -exec sh -c 'expand -i -t 4 {} > {}-t && mv {}-t {}' ';'
使用cmd file > file-t && mv file-t file
技巧的原因是shell在看到重定向时会删除file-t
的内容。因此,如果您使用过cmd file > file
,则cmd
只会看到一个空文件。