sed 用多行的句子代替

Dᴀʀ*_*ᴅᴇʀ 11 command-line sed

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

这个:

Lorem Ipsum is simply dummy text of the printing and typesetting industry.
Run Code Online (Sandbox Code Playgroud)

实际上是这样写的:

Lorem Ipsum is simply dummy text of the 
printing and typesetting industry.
Run Code Online (Sandbox Code Playgroud)

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

Rad*_*anu 16

以下命令适用于两种情况:

sed '/Lorem.*/ {N; s/Lorem.*industry\./string to replace/g}' filename
Run Code Online (Sandbox Code Playgroud)

更多解释:如何使用 sed 替换多行字符串?

  • @Gilles 我理解你的好意,但请先尝试测试以弄乱我的答案。如果您有其他意见,最好添加另一个答案或发表评论。 (3认同)

Gil*_*il' 12

虽然 sed 可以匹配多行模式(使用命令NH在匹配前附加连续行),但这远远超出了它的舒适区。只有当你喜欢痛苦时才尝试它。

Perl 可以很好地完成这类事情。使用-p开关使其一次处理标准输入一条记录并打印修改后的记录(à la sed),并-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'
Run Code Online (Sandbox Code Playgroud)

如果您想在原始文本包含换行符时在替换文本中放置一个换行符,那就更复杂了。如何做到这一点取决于您对在哪里放置换行符的要求。