sed全字搜索和替换,但包括其他字符

时间:2014-04-18 09:31:59

标签: shell sed

要用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 + datesed命令是什么?

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

2 个答案:

答案 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