代码之家  ›  专栏  ›  技术社区  ›  ksuralta

sed全词搜索与替换

  •  150
  • ksuralta  · 技术社区  · 17 年前

    sed -i 's/[oldtext]/[newtext]/g' <file> 
    

    也将替换部分匹配 [oldtext]

    5 回复  |  直到 12 年前
        1
  •  179
  •   Joakim Lundborg    17 年前

    \正则表达式中的b匹配单词边界(即第一个单词字符和非单词字符之间的位置):

    $ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
    no bar embarassment
    
        2
  •  153
  •   Roland Weber    8 年前

    在Mac OS X上, 两者都不 这些正则表达式语法在内部工作 流编辑器 用于匹配整个单词

    • \bmyWord\b
    • \<myWord\>

    现在听我说,以后相信我, 丑陋的语法是你需要使用的:

    • /[[:<:]]myWord[[:>:]]/

    例如,为了替换 薄荷 随着 薄荷味的

    • sed "s/[[:<:]]mint[[:>:]]/minty/g"

    来源: re_format man page

        3
  •  15
  •   t0r0X    9 年前

    \b

    sed -i 's/\boldtext\b/newtext/g' <file>
    
        4
  •  8
  •   Community Mohan Dere    9 年前

    \b \< “用于起始分隔符和” \> “用于结束分隔符。

    Joakim Lundberg

    $ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
    no bar embarassment
    
        5
  •  0
  •   fzbd    4 年前

    对于符合posix的替代方案,考虑替换单词边界匹配( \b [^a-zA-Z0-9] ),同时考虑到行首发生的情况( ^ )线的末端( $ ).

    然而,如果你想支持要替换的单词的重复出现(例如。 oldtext oldtext ). sed --posix 无法识别以下表达式 \(^\|[^a-zA-Z0-9]\) ,而且你不能利用环视。

    看来我们必须明确地匹配所有可能的情况。这里有一个替换的解决方案 mint 随着 minty :

    echo 'mint 0mint mint mint0 mint__mint mint__ mint_ -mint mint mint mint_ mint -mint- mint mint mintmint mint' \
      | sed --posix '   
    s/^mint$/minty/g;
    s/^mint\([^a-zA-Z0-9]\)/minty\1/g;
    s/\([^a-zA-Z0-9]\)mint$/\1minty/g;
    s/\([^a-zA-Z0-9]\)mint\([^a-zA-Z0-9]\)mint\([^a-zA-Z0-9]\)mint\([^a-zA-Z0-9]\)/\1minty\2minty\3minty\4/g;
    s/\([^a-zA-Z0-9]\)mint\([^a-zA-Z0-9]\)mint\([^a-zA-Z0-9]\)/\1minty\2minty\3/g;
    s/\([^a-zA-Z0-9]\)mint\([^a-zA-Z0-9]\)/\1minty\2/g;
    '
    # minty 0mint minty mint0 minty__minty minty__ minty_ -minty minty minty minty_ minty -minty- minty minty mintmint minty