要用sed
替换整个单词,请执行以下操作:
$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment
这取自another stackoverflow question。关注问题,如何更改单词的定义?
来自linuxtopia:
GNU sed,ssed,sed16,sed15和sedmod使用某些符号来定义一个"字符"和一个非单词字符。单词字符适合正则表达式" [A-Za-z0-9 _]"。
如何包含例如" - &#34 ;?或者在我的特定情况下,我想在R
代码库中重命名变量,其中包含"。" (它通常用于代替" _"在变量名中,例如参见google's R styleguide),所以我想包含"。"在一个单词的定义中。
修改
要更清楚,说我想将current.my.date <- my.date + today
更改为current.my.date <- any.date + date
,sed
命令是什么?
e.g。修复此命令
echo "current.my.date <- my.date + today" | sed "s/\bmy.date\b/any.date/g"
current.any.date <- any.date + today
因为它的当前形式也会更改current.my.date
答案 0 :(得分:2)
试试这个:
$ echo "current.my.date <- my.date + today" |
sed -r 's/(^|[^[:alnum:]_.])my\.date([^[:alnum:]_.]|$)/\1any.date\2/g'
current.my.date <- any.date + today
它假定“单词”是“字母数字或_或”的序列。由该字符集之外的字符分隔的字符,或者以字符串开头(^)开头,或者以字符串结尾($)结束。
如果那不是您想要的,请发布更多样本输入和预期输出。
声音就像你需要一些变化:
awk '{
head = ""
tail = $0
while( match( tail, /(^|[^[:alnum:]_.])my\.date([^[:alnum:]_.]|$)/ ) ) {
head = head substr(tail,1,RSTART-1) "any.date"
tail = substr(tail,RSTART+RLENGTH-1)
}
print head tail
}' file
得到你想要的东西。
答案 1 :(得分:1)
所以我想加入“。”在单词的定义中
您可以使用此角色类:
[A-Za-z0-9_.]
如果你想添加连字符,请使用:
[A-Za-z0-9_.-]
另外请记住,这些添加内容不能作为单词边界在\b
上回复,因为连字符和点也被视为字边界。你可以在这种情况下使用否定的字符类:
[^A-Za-z0-9_.-]
echo "foo-bar embarassment" | sed "s/\([A-Za-z0-9_.-]\+\)/no \1/g"
no foo-bar no embarassment