问题描述:

I'm trying to detect a pattern that has three parts:

  1. A space
  2. Either an "m" or a "t"
  3. Either a space or the end of a line

I want to keep #2 and #3. For example, I'd like to change "i m sure he doesn t" to "im sure he doesnt"

I'm having trouble expressing #3, since [ $] only seems to match spaces, not line-ends. Here's what I've tried:

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

im sure he doesn t

How should I express "either a space or end of line" in the expression above? Thanks!

网友答案:

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.
网友答案:

Space or end of line? Use |:

s/ \([mt]\)\( \|$\)/\1\2/g
网友答案:

Make last space optional:

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

Posix friendly version:

sed 's/[ ]\([mt][ ]\{,1\}\)$/\1/' input
相关阅读:
Top