我需要使用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
答案 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)
除了.
之外,它还会检查两个字段,这两个字段保持不变:
引导空白或任何开放(
,[
或{
。
跟踪字母字符或_
或.
。
不幸的是,虽然\+
regexp 匹配一个或多个空格 et al ,但如果.
位于开头,则会失败线。 (将\*
替换为' *'将与开头匹配,但会将c.d
错误地更改为cd
。)因此,有一个kludge .. 。s/^/& /
在行的开头插入一个虚拟空格,\+
按照需要工作,然后s/^ //
删除虚拟空间。