vim 正常模式下的“%s”和常规 GNU sed 有什么区别

vim 正常模式下的“%s”和常规 GNU sed 有什么区别

我对正则表达式很陌生,并且认为使用正则表达式将 markdown(maardown 的自定义/制作格式)转换为 html 将是一个很好的入门方法。当我在 Vim(8.1) 中时,说转换这一行;

+style
#include <style.css>
-style

到;

<link rel="stylesheet" type="text/css" href="style.css">

我在 Vim 中使用了这个命令;

:%s/^+style$\n\(.*\)$\n^-style/<link rel="stylesheet" type="text\/css" href="\1">/g

我得到了我想要的。但是,当我使用 GNU sed 从终端运行相同的命令时,输出没有变化;

sed 's/^+style$\n\(.*\)$\n^-style/<link rel="stylesheet" type="text\/css" href="\1">/g'

此外,包括该-z标志似乎也没有多大帮助,输出与输入保持相同。

我不知道这是为什么。

答案1

正如问题中所示,您的sed命令根本无法在其输入中看到任何换行符,因为它sed是面向行的编辑器。数据将一次显示sed一行,并删除实际的换行符。

-z使用 GNU添加sed将使实用程序使用 nul ( \0) 作为其分隔符。这意味着您现在将获得所有的立即将文档放入sed编辑缓冲区,并能够使用\n.然而,它也意味着^并且$不会匹配开始和结束线不再。

就我个人而言,我会使用标准sed命令

sed '/^+style$/,/^-style$/ s|^#include.*|<link rel="stylesheet" type="text/css" href="style.css">|' file

这会做三件事与您尝试做的不同:

  1. 它使用地址范围/^+style$/,/^-style$/来寻址命令应影响的行s///

  2. 在该范围内,替换命令#include在行的开头匹配。

  3. 替换命令是用|分隔符而不是通常的分隔符编写的/,以允许模式和/或替换文本包含/而不转义。这有助于可读性。

(此外,它不要求GNU sed。)

修改后的命令也可以在 Vim 中使用,尽管您必须在 Vim 中用作命令/的分隔符s///。编辑器ed将能够使用相同的命令sed

相关内容