I\'m trying to detect a pattern that has three parts:
I
Space or end of line? Use |
:
s/ \([mt]\)\( \|$\)/\1\2/g
Just matching space, then m or t, then space or newline won't catch cases with punctuation, e.g. a missing '
in "please don t!"
. A more general solution is to use word boundaries instead:
echo "i m sure he doesn t test test don t." | sed 's/ \([mt]\)[[:>:]]/\1/g'
The funky [[:>:]]
is required on OS X (which I use), see Larry Gerndt's answer to sed whole word search and replace. On other sed flavors you may be able to use \b
(any word boundary) or \>
instead.
# 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.
Make last space optional:
sed 's/[ ]\([mt][ ]\?\)$/\1/' input
Posix friendly version:
sed 's/[ ]\([mt][ ]\{,1\}\)$/\1/' input