使用regexr,我使用3个假设编写了表达式/[\.!?] [A-Z]/g
来匹配句子:
使用sed
,我想接受这些匹配,并用\n
字符替换空格。我可以做一场赛后$'和一场赛前$',但我怎样才能在比赛中替换?
如果有更好的方法将文本分成每行一个句子,我愿意接受替代方案。
没有bashisms:适用于Linux,OS X和BSD
输入:
Vivamus fermentum semper porta。 Nunc diam velit,adipiscing ut tristique vitae,sagittis vel odio。 Maecenas convallis ullamcorper ultricies。 Curabitur ornare,ligula semper consectetur sagittis,nisi diam iaculis velit,id fringilla sem nunc vel mi。
输出:
Vivamus fermentum semper porta.
Nunc diam velit, adipiscing ut tristique vitae, sagittis vel odio.
Maecenas convallis ullamcorper ultricies.
Curabitur ornare, ligula semper consectetur sagittis, nisi diam iaculis velit, id fringilla sem nunc vel mi.
答案 0 :(得分:1)
您可以使用此替代品:
sed 's/\([.!?][.!?]*\) *\([A-Z]\)/\1\n\2/g;' file
\(...\)
分隔捕获组,\1
是对捕获内容的引用。
sed的OSX版本不会将\n
解释为换行符,您必须使用序列\1'$'\n\\2
作为替换字符串。
更多POSIX方式包括写:
sed 's/\([.!?][.!?]*\) *\([A-Z]\)/\1\
\2/g;' file
使用@cliffordheath建议的转义换行符。
请注意,点不需要在字符类中进行转义。
答案 1 :(得分:0)
您需要使用带\(和\)的捕获组重新插入标点符号和首字母。此示例允许以下句子以任何字母数字开头(但需要至少一个空格以避免弄乱十进制数字):
$ sed -e 's/\([.!?]\) *\([[:alnum:]]\)/\1\
\2/g'
foo. bat! baz? foo, bar.
foo.
bat!
baz?
foo, bar.
我希望这会有所帮助。