使用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> {}' \;中。
发布于 2014-08-23 20:32:03
这可能对您有用(GNU sed):
sed -ri ':a;s/^( *)\t/\1 /;ta' file发布于 2014-08-23 20:21:56
您应该真正地使用expand,因为它的开发只是为了做到这一点。从它的文档
-i,-在非空白之后不要转换制表符
因此,对单个文件的命令是:
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的stdout而不是expand的stdout。
发布于 2014-08-23 20:26:45
对于单个comand行,您可以使用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只会看到一个空文件。
https://stackoverflow.com/questions/25465961
复制相似问题