4

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

  1. 空间
  2. “m”或“t”
  3. 空格或行尾

我想保留#2 和#3。例如,我想将“我确定他没有”更改为“我确定他没有”

我在表达 #3 时遇到了麻烦,因为[ $]似乎只匹配空格,而不是行尾。这是我尝试过的:

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

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

4

3 回答 3

4

空格还是行尾?使用|

s/ \([mt]\)\( \|$\)/\1\2/g
于 2013-01-02T23:45:31.873 回答
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.
于 2013-01-03T00:03:39.667 回答
0

使最后一个空格可选:

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

Posix 友好版本:

sed 's/[ ]\([mt][ ]\{,1\}\)$/\1/' input
于 2013-01-02T23:48:18.927 回答