2015-06-25 31 views
-1

一個面試問題.c文件我讀:格式使用的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);

+2

這個面試問題顯示了面試官的無知。RE不能平衡括號或計算字符(比如''',以便知道你是否在C字符串內部或外部),所以你最終會在字符串內部改變括號內的空格。如果你使用RE來完成這個 – fferri

+1

@mescalinum假定括號在C字符串中不存在,那麼我們如何解決這個問題,以及如何通過我的代碼失敗的情況 –

+1

當然,他們可以自引入[遞歸](http:// www.regular-expressions.info/recurse.html)和[平衡組](http://www.regular-expressions.info/balancing.html)。 –

回答

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 
+0

您的代碼創建在給定的測試用例中有兩個空格(__)__)__)__) –

+0

我注意到並更改了代碼。 – chw21

+0

我剛剛注意到另一件事:我的示例現在對於引用的賦值是正確的,但對於您的示例而言將不正確:在您的示例輸出中,最後一個右括號和分號之間沒有空格。但是我看不到任務中有這樣的限制,而且我沒有實現它。 – chw21

1
sed -e "/[\"']/ b" -e ' 
s/[[:blank:]]*\([()]\)[[:blank:]]*/ \1 /g 
:cycle 
s/\([()]\)[[:blank:]]\{2,\}\([()]\)/\1 \2/g;t cycle 
s/) ;/);/' YourFile 
  • 初試跳過符合"',有點困難(長碼)來治療(可選)
  • 對待特殊;後a )
  • 使用類blank而不是space僅用於選項卡ansd空間字符而不是其他c如NL,FF,VT,CR(通常不是必須的,因爲我們在這裏處理1行,但在c中,你可以在幾行上有指令,所以如果你想擴展)

適應空間inbetween (感謝@ User112638726這句話)

+0

這會在相鄰的括號內留下多個空格 – 123

+0

@ User112638726對,忘記'g'只出現在下一次出現的位置,因此一次更改/模式被排除在下一次搜索之外。代碼適用於此 – NeronLeVelu

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(新點(x,graph.getY())));