2017-07-04 40 views
1

我需要使用sed刪除點,但不是所有的點。sed&protobuf:需要刪除點

- repeated .CBroadcast_GetBroadcastChatUserNames_Response.PersonaName persona_names = 1 
+ repeated CBroadcast_GetBroadcastChatUserNames_Response.PersonaName persona_names = 1 

這裏點repeated後,(repeated也可以optional | required | extend)應予以刪除

- rpc NotifyBroadcastViewerState (.CBroadcast_BroadcastViewerState_Notification) returns (.NoResponse) 
+ rpc NotifyBroadcastViewerState (CBroadcast_BroadcastViewerState_Notification) returns (NoResponse) 

這裏刪除點後(

應該對不同內容的多個文件。


的完整代碼,可以發現here

+0

這是什麼問題? – 123

+2

你沒有解釋任何命令應該做的邏輯,例如它可能只是'sed's /\.// g''。 – 123

+2

當人們要求你解釋時,這意味着你的問題並不清楚(通常)。請更新您的問題,而不是回覆評論。您可以隨時添加評論「請參閱上面的修訂版Q,感謝您的幫助」;-)。祝你好運。 – shellter

回答

3

甲也許更簡單的方案(可工作在GNU sed和BSD/MACOS sed):

sed -E 's/([[:space:][:punct:]])\./\1/g' file 

在情況a .也可以表現爲行上的第一字符,使用以下varation :
sed -E 's/(^|[[:space:][:punct:]])\./\1/g' file

的假設是,任何.之前由:

  • 一個空白字符(字符類[:space:]
    • 如: .
  • 或一個標點符號字符(字符類[:punct:]
    • 如:(.

應被刪除,通過只用.之前的字符替換匹配的序列,在正則表達式經由子表達式(...)捕獲,並且在替換字符串與\1(第一個捕獲組)被引用。


如果顛倒邏輯,你可以嘗試簡單:

sed -E 's/([^[:alnum:]])\./\1/g' file 

如果一個.也可以顯示爲第一字符一行:
sed -E 's/(^|[^[:alnum:]])\./\1/g' file

這將取代所有期間不是^)前加一個字母數字字符(一個字母或數字)。

+1

謝謝,我會使用[agc's](https://stackoverflow.com/a/44911416/8254934)解決方案,但這看起來更漂亮 –

+0

@morphchallenge:我很高興聽到它;我只是添加了一個更簡單的解決方案來反轉邏輯。在一個元注意:你沒有足夠的聲望,但請記住,一旦你達到15分,你可以 - 除了_accepting_答案 - _up-vote_額外的答案,你也發現有用的(如agc的這個案例)。 – mklement0

+0

@agc:謝謝;我不認爲有必要處理初始行'''的情況,給出示例輸入,但我已經更新了答案,以顯示如何處理這種情況,如果需要的話。 – mklement0

1

假設僅領先.需要拆除,這裏的一些GNUsed代碼:

echo '.a_b.c c.d (.e_f.g) ' | 
sed 's/^/& /;s/\([[:space:]{([]\+\)\.\([[:alpha:]][[:alpha:]_.]*\)/\1\2/g;s/^ //' 

輸出:

a_b.c c.d (e_f.g) 

除了.,它檢查兩個字段,它們保持不變:

  1. 前導空白,或任何開口([,或{

  2. 尾隨字母字符或_.

不幸的是,雖然\+正則表達式匹配一個或多個空格,它如果.是在該行的開頭失敗。 (用'*'代替\*將匹配開頭,但會錯誤地將c.d更改爲cd。)因此,有一個雜湊...... s/^/& /在行首插入虛擬空間,這樣\+按需要工作,然後s/^ //刪除虛擬空間。

+0

太棒了!有用。謝謝! –

+0

@morphchallenge:雖然你只能接受1個答案給你的Q,但你可以提出你認爲有幫助的答案;-)。我很高興你有兩個很好的答案。祝你好運。 – shellter