首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将每个前导选项卡替换为四个空格,对每个文件进行递归替换。

将每个前导选项卡替换为四个空格,对每个文件进行递归替换。
EN

Stack Overflow用户
提问于 2014-08-23 20:14:19
回答 3查看 908关注 0票数 5

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

我看过:

  1. sed,但是对于如何在像sed -i 's/^[\t]*/<what-to-put-here?>/g myFile.c这样的表达式中计算匹配的前导制表符,还不太清楚。
  2. astyle,但不知道如何告诉它只需要重新设置,而不是格式化
  3. indent,和astyle一样的问题
  4. expand,但它也取代了非领先标签,我必须自己处理内部替换,这是容易出错的。

我只是在寻找一种快速简单的解决方案,可以插入到find -type f -name "*.c" -exec '<tabs-to-spaces-cmd> {}' \;中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-23 20:32:03

这可能对您有用(GNU sed):

代码语言:javascript
复制
sed -ri ':a;s/^( *)\t/\1    /;ta' file
票数 3
EN

Stack Overflow用户

发布于 2014-08-23 20:21:56

您应该真正地使用expand,因为它的开发只是为了做到这一点。从它的文档

-i,-在非空白之后不要转换制表符

因此,对单个文件的命令是:

代码语言:javascript
复制
expand -i -t 4 input > output

为了与多个文件一起使用它,您需要一个技巧:

代码语言:javascript
复制
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。

票数 5
EN

Stack Overflow用户

发布于 2014-08-23 20:26:45

对于单个comand行,您可以使用expand -i,就像另一个答案描述的那样,但是要使用find命令实现过程的自动化,您可以使用:

代码语言:javascript
复制
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只会看到一个空文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25465961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档