sed& protobuf:需要删除点

时间:2017-07-04 16:35:44

标签: regex bash sed proto

我需要使用sed删除点,但不是所有点。

- 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

2 个答案:

答案 0 :(得分:3)

一个可能更简单的解决方案(适用于GNU sed和BSD / macOS sed):

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

如果.也可以在一行显示为第一个字符,请使用以下文件:
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 :(得分:1)

假设只需删除前导.,此处有一些 GNU sed代码:

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. 跟踪字母字符或_.

  3. 不幸的是,虽然\+ regexp 匹配一个或多个空格 et al ,但如果.位于开头,则会失败线。 (将\*替换为' *'将与开头匹配,但会将c.d错误地更改为cd。)因此,有一个kludge .. 。s/^/& /在行的开头插入一个虚拟空格,\+按照需要工作,然后s/^ //删除虚拟空间。