我读过一个面试问题:
让我们说你在我的团队中,我已经决定我是一个真正的坚持者 代码格式化。但我有特殊的口味,有一天我决定我 希望所有括号在代码中都能非常清晰地显示出来。
因此,假设您有一组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);
答案 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())));