Sed regexp查找空格或行尾

Sed regexp查找空格或行尾,regex,sed,Regex,Sed,我正在尝试检测一种由三部分组成的模式: 空间 “m”或“t” 空格或行尾 我想保留2和3。例如,我想把“我肯定他不会”改为“我肯定他不会” 我很难表达#3,因为[$]似乎只匹配空格,而不匹配行尾。以下是我尝试过的: $ echo "i m sure he doesn t" | sed 's/ \([mt]\)\([ $]\)/\1\2/g' im sure he doesn t 在上面的表达式中,我应该如何表达“空格或行尾”?谢谢 空格还是行尾?使用|: s/ \([mt]\)\( \|$\)

我正在尝试检测一种由三部分组成的模式:

  • 空间
  • “m”或“t”
  • 空格或行尾
  • 我想保留2和3。例如,我想把“我肯定他不会”改为“我肯定他不会”

    我很难表达#3,因为
    [$]
    似乎只匹配空格,而不匹配行尾。以下是我尝试过的:

    $ echo "i m sure he doesn t" | sed 's/ \([mt]\)\([ $]\)/\1\2/g'
    im sure he doesn t
    

    在上面的表达式中,我应该如何表达“空格或行尾”?谢谢

    空格还是行尾?使用
    |

    s/ \([mt]\)\( \|$\)/\1\2/g
    

    将最后一个空格设置为可选:

    sed 's/[ ]\([mt][ ]\?\)$/\1/' input
    
    Posix友好版:

    sed 's/[ ]\([mt][ ]\{,1\}\)$/\1/' input
    

    仅匹配空格,然后是m或t,然后是空格或换行符不会捕获标点符号的情况,例如
    “请不要!”
    中缺少的
    。更普遍的解决方案是使用单词边界:

    echo "i m sure he doesn t test test don t." | sed 's/ \([mt]\)[[:>:]]/\1/g'
    
    时髦的
    [[[:>:]]
    在OSX上是必需的(我使用的),请参阅Larry Gerndt的答案。在其他sed版本中,您可以使用
    \b
    (任何单词边界)或
    \>

    # example with word boundary
    echo "i m sure he doesn t test test don t." | sed 's/ \([mt]\)[[:>:]]/\1/g'
    im sure he doesnt test test dont.
    

    一旦你把
    $
    放在
    []
    里面,它就会被逐字处理,而不是作为一个行尾标记。这个对我不起作用。它仍然忽略了行的末尾
    $echo“我肯定他不会”| sed的/\([mt]\)\(\\$\)/\1\2/“我肯定他不会”
    有不同风格的unix或sed会给我不同的结果吗?如果是这样的话,我怎么知道我用的是哪一个呢?@Moira:只需在末尾加上
    /g
    。太好了!我不在mac电脑上,所以这对我来说很有用:
    sed的/\([mt]\)\>/\1/g'