sed通过多行句子替代


11

我是使用sed的新手,但是我一直在尝试使用sed s/..../..../(替代)来修改整个句子(如果它位于一行上),但是我不知道如何修改可能被分成两行的句子的替代解决方案,例如:

这个:

Lorem Ipsum is simply dummy text of the printing and typesetting industry.

实际上是这样写的:

Lorem Ipsum is simply dummy text of the 
printing and typesetting industry.

即使是两行而不是一行,您如何检测到它或对其进行编码以替换整个句子?


出色的sed参考书:sed教程和参考的权威指南,作者Daniel A. Goldman ISBN:978-1-939824-01-1(EPUB版本)08148804441822

Answers:


16

以下命令在两种情况下均可使用:

sed '/Lorem.*/ {N; s/Lorem.*industry\./string to replace/g}' filename

更多说明:如何使用sed替换多行字符串?


3
@吉尔斯,我了解您的良好意愿,但请尝试先进行测试,以弄乱我的答案。如果您有其他意见,最好是添加另一个答案或发表评论。
RaduRădeanu13年

欢迎使用Stack Exchange。该网站是经过协作编辑的。如果您不满意您的贡献是由其他受信任的用户进行协作编辑的想法,则该网站可能不适合您。我注意到,你的代码取代了超过原打算在特定词组,所以我编辑语中的。
吉尔“SO-停止作恶”

@吉尔斯,请,您不必调皮。您还应该注意,您的“代码”绝对不能替代任何东西。正如我所说,我了解您的良好意愿。从我的示例中,我假设OP了解如何用多行代替一个句子sed,仅此而已。这就是标题问题。标题不是perl
RaduRădeanu2013年

不,我发布的代码确实有效。(除非Lorem在最后一行,否则它会与您的版本共享一个缺陷。)
Gilles'SO-不要邪恶

当文本行数为3或更多时,此示例不起作用:(
artnikpro

12

sed可以匹配多行上的模式(使用命令NH在匹配前添加连续的行),但这远远超出了它的舒适范围。仅当您喜欢疼痛时才尝试。

Perl可以很好地完成这种事情。使用-p开关使它一次处理标准输入一个记录,并打印修改的记录(已保存),然后-000打开段落模式(记录由空行分隔)。在正则表达式中,\s匹配包括换行符在内的任何空格字符。

perl -p -000 -e 's/Lorem\s+Ipsum\s+is\s+simply\s+dummy\s+text\s+of\s+the\s+printing\s+and\s+typesetting\s+industry\./Replacement text/g'

如果您要在原始文本包含换行符时在换行符中添加换行符,则更为复杂。如何做取决于您对放置换行符的要求。


@terdon啊,我的意思是允许多个空格但忘了。谢谢,固定。
吉尔(Gilles)“所以

问题是关于sed。也用标记sed,而不用perl
RaduRădeanu2013年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.