Sed 是否将行开头的所有制表符替换为8个空格?

Sed 是否将行开头的所有制表符替换为8个空格?,sed,Sed,我只是偶然发现了一个我觉得异常困难的问题。我想用8个空格替换所有*.cc和*.h文件行开头的所有制表符。比如: sed 's/\t/ /g' -i *.cc *.h 但仅限于行的开头。请记住,sed的/^\t//g'-i*.cc*.h不会处理行以多个制表字符开头的情况 如何使用sed实现这一点?您可以使用以下命令: sed ':label s/^\(\( \)*\)\t/\1 /; t label' -i *.cc *.h 您可以在这里阅读有关

我只是偶然发现了一个我觉得异常困难的问题。我想用8个空格替换所有*.cc和*.h文件行开头的所有制表符。比如:

sed  's/\t/        /g' -i  *.cc *.h
但仅限于行的开头。请记住,
sed的/^\t//g'-i*.cc*.h
不会处理行以多个制表字符开头的情况


如何使用sed实现这一点?

您可以使用以下命令:

sed ':label s/^\(\(        \)*\)\t/\1        /; t label' -i  *.cc *.h
您可以在这里阅读有关sed中分支的内容:

使用sed

sed -r ':a s/(^ {8}*)\t/\1        /;ta'
试着用

sed -e '/^\t/ s/\t/        /g'

你可能需要一个C美容师。查看[关于Stackoverflow的问题][1]。[1] :嗯,我基本上只想做这个特别的改变。配置beautifier来完成所有工作将花费大量时间。在正则表达式中,星号用于表示前面符号的零个或多个。因此,下面的sed命令可能会起作用,但我没有测试:
sed的//^\t\t*//g'-I*.cc*.h
the^\t\t*将表示一行开头的一个或多个制表符。我认为它不会用8个空格的多个序列替换多个制表符。好的,我明白您现在正在尝试的操作。我认为您需要的是一个循环,它重复执行您最初发布的命令,直到不再有任何以
\t
开头的行。测试条件类似于
(grep^\t filename | wc-l)==0
。不确定是否必须用一个小脚本来完成,或者是否有可能用一个聪明的单行程序来完成。