使用sed格式化.c文件

时间:2015-06-25 05:46:33

标签: bash shell sed

我读过一个面试问题:

  

让我们说你在我的团队中,我已经决定我是一个真正的坚持者   代码格式化。但我有特殊的口味,有一天我决定我   希望所有括号在代码中都能非常清晰地显示出来。

     

因此,假设您有一组C,C ++或Java的源文件。您的   选择。我希望你修改它们,以便在每个源文件中,   每个开括号和近括号都只有一个空格字符   之前和之后。如果周围有任何其他空格   括号,它被折叠成一个空格字符。

例如,这段代码:

foo (bar ( new Point(x, graph.getY()) ));

将被修改为如下所示:

foo ( bar ( new Point ( x, graph.getY ( ) ) ) );

如何用sed做到这一点?

修改
我的方法

sed -Ee 's/([()])([()])([()])/\1 \2 \3 /g' -e 's/([ ]{1,}|^|([0-9a-zA-Z()]))([()])([ ]{1,}|$|([0-9;a-z()]))/\2 \3 \5/g'  filename.c 

func(a);我的代码将其输出为func ( a);

的情况下失败

3 个答案:

答案 0 :(得分:2)

已更新:您需要将前导和尾随空格减少到彼此独立的一个:

$ cat par.sed
s/[[:space:]]*\([()]\)/ \1/g
s/\([()]\)[[:space:]]*/\1 /g
$ sed -i.bak -f par.sed filename.c

更容易理解脚本:

# Collapse leading spaces:
s/ *(/ (/g
s/ *)/ )/g
# Collapse trailing spaces:
s/( */( /g
s/) */) /g

答案 1 :(得分:1)

sed -e "/[\"']/ b" -e '
s/[[:blank:]]*\([()]\)[[:blank:]]*/ \1 /g
:cycle
s/\([()]\)[[:blank:]]\{2,\}\([()]\)/\1 \2/g;t cycle
s/) ;/);/' YourFile
  • 首先测试跳过"',更难处理(长代码)(可选)
  • ;
  • 之后处理特殊)
  • 使用类blank而不是space仅使用tab ansd space char而不是其他情况,如NL,FF,VT,CR(通常不需要因为我们在这里处理1行)但是在c中,你可以在几行上有说明,所以如果你想扩展)

适应中间的空间(感谢@ User112638726的评论)

答案 2 :(得分:0)

试试

echo "foo (bar ( new Point(x, graph.getY()) ));" | sed -r 's/([^ ])\(/\1 \(/g; s/([^ ])\)/\1 \)/g; s/\(([^ ])/\( \1/g; s/\)([^ ])/\) \1/g'  

输出
    foo(bar(new Point(x,graph.getY())));