2017-07-04 21 views
1

すべてのドットではなく、sedを使ってドットを削除する必要があります。sed&protobuf:ドットを削除する必要があります

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

ここrepeated後のドット、(repeatedoptional | required | extend可能)が

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

を削除し、ここには、異なるコンテンツを複数のファイルで動作するはずです(

後にドットを削除する必要があります。

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) 

完全なコードのみをリード.ニーズの除去を想定しhere

+0

問題が何ですか? – 123

+2

あなたはコマンドが何をすべきかの論理を説明していません。あなたの例では 'sed '/////////////////////////////////// – 123

+2

人々はあなたに説明を求めたら、あなたの質問がはっきりしていないことを意味します(通常)。コメントではなくQを更新してください。 「あなたの助けを借りて、改訂Qを見てください」というコメントをいつでも含めることができます;-)。がんばろう。 – shellter

答えて

3

Aおそらく単純な溶液(GNU sed及びBSD/MacOSのsedの両方で動作する)場合

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

.は以下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の](https://stackoverflow.com/a/44911416/8254934)解決策も動作しますが、これはもっときれいに見えます –

+0

@morphchallenge:私はそれを聞いてうれしく思います。私は、ロジックを反転する簡単なソリューションを追加しました。メタノートについて:まだ十分な評判はありませんが、15ポイントに達すると、回答に_accepting_するだけでなく、_up-vote_さらに役立つと思われる追加の回答(agc's inこの場合)。 – mklement0

+0

@agc:ありがとう。私は、サンプル入力を与えられた行頭の '.'の大文字小文字を処理する必要はないと思っていましたが、必要であればその処理方法を示す答えを更新しました。 – mklement0

1

を見つけることができ、ここでいくつかGNUsedコードです

  1. リーディング空白、または任意の開口([、又は{:210 .に加え、それはそのまま残されている2つのフィールドをチェックします。

  2. アルファベット文字の末尾には、_または.も含まれます。

\+regexpは 1つ以上のスペースに一致している間.が行の先頭にある場合は残念ながら、それは失敗します。 (\*を '*'に置き換えると、最初と一致するが、c.dcdに間違って変更することになる)... s/^/& /は、\+のように行の先頭にダミースペースを挿入し、 s/^ //はダミースペースを削除します。

+0

恐ろしい!できます。ありがとうございました! –

+0

@morphchallenge:あなたのQに1つの答えしか受け入れることはできませんが、あなたが助けてくれた回答をアップアップすることができます;-)。私はあなたに2つの良い答えがあることをうれしく思っています。がんばろう。 – shellter

関連する問題