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]\)\( \|$\)
[$]
似乎只匹配空格,而不匹配行尾。以下是我尝试过的:
$ 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'