将每个前导选项卡替换为四个空格,递归地为每个文件

时间:2014-08-23 20:14:20

标签: regex sed indentation

使用Linux中的常用工具实现此目的的最简单方法是什么?

我看过:

  1. sed,但不太了解如何计算sed -i 's/^[\t]*/<what-to-put-here?>/g myFile.c等表达式中匹配的主要标签。
  2. astyle,但无法弄清楚如何告诉它只是重新投入而不是格式
  3. indent,与astyle相同的问题
  4. expand,但它也取代了非主要标签,我必须自己处理内部替换,这很容易出错。
  5. 我只是在寻找一种快速简便的解决方案,我可以插入find -type f -name "*.c" -exec '<tabs-to-spaces-cmd> {}' \;

3 个答案:

答案 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只会看到一个空文件。