📌  相关文章
📜  sed 从匹配到另一个匹配 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:05:08.322000             🧑  作者: Mango

sed 从匹配到另一个匹配

sed 是一个流编辑器,主要用于进行文本转换和文本替换。在 sed 中使用正则表达式进行模式匹配是非常常见的操作,但是有时候我们不仅需要匹配一个模式,还需要匹配另一个模式之间的内容。

使用 sed 从匹配到另一个匹配

sed 中,我们可以使用一个模式空间来存储文本,然后使用正则表达式从中选取匹配的部分。 sed 还允许我们使用地址来指定想要处理的特定行。结合这些特性,我们可以使用 sed 从匹配到另一个匹配。

为了演示这个功能,我们将使用以下示例文本:

#!/bin/bash

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Praesent bibendum nibh id eros congue rhoncus. 
Cras risus nulla, bibendum vel sapien vel, feugiat porttitor ex. 
Duis eu consequat odio. Sed lobortis, eros et gravida ultrices, odio libero viverra nunc, in pulvinar turpis metus ut nibh. 
Donec velit tellus, euismod eu eleifend id, consequat eget nisi. 
Nulla facilisi.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Maecenas posuere molestie massa, quis auctor quam venenatis nec. 
Nulla facilisi. Mauris nibh elit, malesuada eget velit eu, posuere fringilla orci. 
Nulla facilisi. Proin in sagittis massa, bibendum efficitur orci. 
Donec ac magna sed neque scelerisque suscipit. Pellentesque imperdiet nunc at porttitor luctus.

Ut non dapibus tortor. Morbi lobortis euismod lacus eget volutpat. 
Etiam sed dolor et lacus malesuada ultrices vel nec enim. 
Nunc tincidunt nunc nec nisi efficitur volutpat. 
Vivamus turpis velit, pellentesque eu justo ut, faucibus condimentum nisl. 
Vivamus et facilisis risus. Donec nulla neque, varius nec nisl sed, rutrum fringilla augue.

现在,让我们假设我们希望从匹配“Lorem ipsum”到匹配“Nulla facilisi。”的所有行,并将它们替换为“替换文本”。

为了实现这一点,我们可以使用以下 sed 命令:

sed -n '/Lorem ipsum/,/Nulla facilisi./{
s/Lorem ipsum/Replacement text/g
p
}' < file.txt

让我们来分析一下这个命令做了什么。

  • -n 标志告诉 sed 不要打印所有行,除非它明确被要求打印。
  • /Lorem ipsum/,/Nulla facilisi./ 是一个地址范围,它匹配从包含“Lorem ipsum”到包含“Nulla facilisi.”的所有行。
  • s/Lorem ipsum/Replacement text/g 是一个 s 命令,它找到匹配“Lorem ipsum”并将其替换为“替换文本”。 g 标志告诉 sed 更改所有匹配而不只是第一个匹配。
  • p 命令在处理的每一行上打印模式空间(即替换后的行)。

这个命令的输出如下:

#!/bin/bash

Replacement text dolor sit amet, consectetur adipiscing elit. 
Praesent bibendum nibh id eros congue rhoncus. 
Cras risus nulla, bibendum vel sapien vel, feugiat porttitor ex. 
Duis eu consequat odio. 替换文本, eros et gravida ultrices, odio libero viverra nunc, in pulvinar turpis metus ut nibh. 
Donec velit tellus, euismod eu eleifend id, consequat eget nisi. 
替换文本.

替换文本 dolor sit amet, consectetur adipiscing elit. 
Maecenas posuere molestie massa, quis auctor quam venenatis nec. 
替换文本. Mauris nibh elit, malesuada eget velit eu, posuere fringilla orci. 
替换文本. Proin in sagittis massa, bibendum efficitur orci. 
Donec ac magna sed neque scelerisque suscipit. Pellentesque imperdiet nunc at porttitor luctus.

Ut non dapibus tortor. 替换文本 lobortis euismod lacus eget volutpat. 
Etiam sed dolor et lacus malesuada ultrices vel nec enim. 
Nunc tincidunt nunc nec nisi efficitur volutpat. 
Vivamus turpis velit, pellentesque eu justo ut, faucibus condimentum nisl. 
Vivamus et facilisis risus. 替换文本 nulla neque, varius nec nisl sed, rutrum fringilla augue.

正如我们期望的那样,所有的匹配行都被替换为了“替换文本”。

总结

sed 是一个强大的文本编辑器,可用于从匹配到另一个匹配。使用地址范围和正则表达式,结合 sed 的模式空间和 s 命令,我们可以轻松地执行复杂的文本替换操作。