我正在玩sed
试图更好地理解它。我有一个文本文件,每个句点后没有换行符。作为第一项任务,我想让每个句子以新的一行开头。为此,我尝试使用sed "s|\.|\.\\n|g" <file.txt > newFile.txt
除了在先生或夫人之后创造了一条新线以外,这个工作得很好。为了避免这种情况,我尝试了sed "s|[^Mr]\.|\.\\n|g" <file.txt > newFile.txt
。我怎样才能做到这一点,以便在Mr.
&amp;之后跳过创建一个新行。 Mrs.
?
SETUP:从文件命令行调用sed
编辑:
如果我不使用sed
(我只是为了了解它而使用它),最好的是什么? Perl作为答案之一已经提出过?谢谢!
答案 0 :(得分:1)
这是使用外观正则表达式的一个很好的例子。您可以使用负面反对正则表达式:
(?<!Mr|Mrs)\.
<强> Working demo 强>
只有在没有先生或夫人的情况下才会匹配一个点。
正则表达式的解释是:
(?<! look behind to see if there is not:
Mr 'Mr'
| OR
Mrs 'Mrs'
) end of look-behind
\. '.'
顺便说一句,你可以使用支持Perl-mode(-R开关)的 ssed ,并且可以帮助你使用这个lookbehind正则表达式,因为sed并不像Bohemian在评论中指出的那样支持环视。在sed documentation,您可以看到有关sed和ssed的更多信息。
你可以这样做:
ssed -R "s|(?<!Mr|Mrs)\.|.\n|g" newFile.txt
答案 1 :(得分:0)
不幸的是,AFAIK sed不支持环顾四周,这样可以轻松完成工作。
由于字符序列Mr.
和Mrs.
没有出现在除标题之外的任何其他上下文中,并且标题没有出现在行尾,您可以通过执行后续更改来删除行来解决问题标题后提供:
sed 's|\. *|.\n|g' 's|\(Mrs?\.\)\n|\1 |g' myfile.txt
免责声明:可能是一些语法问题 - 我没有方便的命令行
答案 2 :(得分:0)
sed 's/\. \{0,1\}/.\
/g;s/\(Mrs\{0,1\}\.\)./\1/g;s/.$//' YourFile
posix版本(因此--posix
用于GNU sed),其中后引用不可用