Sed regexp寻找空白或行尾

时间:2013-01-02 23:43:09

标签: regex sed

我正在尝试检测包含三个部分的模式:

  1. 空格
  2. “m”或“t”
  3. 空格或行尾
  4. 我想保留#2和#3。例如,我想改变“我确定他没有” “我确定他没有”

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

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

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

3 个答案:

答案 0 :(得分:3)

空间还是行尾?使用|

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

答案 1 :(得分:2)

只是匹配空格,然后是m或t,那么空格或换行符将不会捕获带标点符号的情况,例如: '中缺少"please don t!"。更通用的解决方案是使用单词边界:

echo "i m sure he doesn t test test don t." | sed 's/ \([mt]\)[[:>:]]/\1/g'

OS X(我使用的)上需要时髦的[[:>:]],请参阅Larry Gerndt对sed whole word search and replace的回答。在其他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.

答案 2 :(得分:0)

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

sed 's/[ ]\([mt][ ]\?\)$/\1/' input

Posix友好版:

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