2017-07-04 59 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