【问题标题】:sed & protobuf: need to delete dotssed & protobuf:需要删除点
【发布时间】:2017-07-04 16:35:44
【问题描述】:

我需要使用 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

【问题讨论】:

  • 有什么问题?
  • 你没有解释命令应该做什么的任何逻辑,对于你的例子它可能只是sed 's/\.//g'
  • 当人们要求你解释时,这意味着你的问题不清楚(通常)。请更新您的 Q 而不是在 cmets 中回复。您可以随时添加评论“请参阅上面的修订 Q,感谢您的帮助”;-)。祝你好运。
  • 为什么不 sed -n 's/(.NoResponse)/(NoResponse)/p' ?
  • 我更新了问题

标签: regex bash sed proto


【解决方案1】:

一个可能更简单的解决方案(适用于 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

这将替换所有不是 (^) 的句点前面有一个字母数字字符(字母或数字)。

【讨论】:

  • 谢谢,我会用这个,agc's 解决方案也可以,但这看起来更漂亮
  • @morphchallenge:我很高兴听到这个消息;我只是添加了一个更简单的解决方案来反转逻辑。关于元注释:您还没有足够的声望,但请记住,一旦您达到 15 分,您可以 - 除了接受答案 - up-vote i> 您也发现有帮助的其他答案(例如本例中的 agc)。
  • @agc:谢谢;鉴于示例输入,我认为没有必要处理行首 . 的情况,但如果需要,我已经更新了答案以显示如何处理这种情况。
  • 又一个皱纹:输入" . "返回空白," ... "返回" .. "
  • @agc:这与样本数据相差甚远。由于我们没有正式的规范,并且答案与描述的一样,我想我会保留它。
【解决方案2】:

假设只有领先的 . 需要删除,这里有一些 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. 尾随字母字符或_.

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

【讨论】:

  • @morphchallenge :虽然您只能接受对 Q 的 1 个答案,但您可以投票赞成您认为有帮助的答案 ;-) 。我很高兴你有两个很好的答案。祝你好运。
猜你喜欢
  • 2011-03-08
  • 2019-09-29
  • 1970-01-01
  • 2014-03-31
  • 2020-05-15
  • 1970-01-01
  • 2015-12-13
  • 2021-07-02
  • 2022-11-03
相关资源
最近更新 更多