用句号和换行符替换所有句号,但避免使用“Mr.Mrs。”使用sed

时间:2014-08-26 22:40:35

标签: regex sed

我正在玩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作为答案之一已经提出过?谢谢!

3 个答案:

答案 0 :(得分:1)

这是使用外观正则表达式的一个很好的例子。您可以使用负面反对正则表达式:

(?<!Mr|Mrs)\.

<强> Working demo

enter image description here

只有在没有先生或夫人的情况下才会匹配一个点。

正则表达式的解释是:

(?<!                     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),其中后引用不可用