我对正则表达式很陌生,并且认为使用正则表达式将 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
这会做三件事与您尝试做的不同:
它使用地址范围
/^+style$/,/^-style$/
来寻址命令应影响的行s///
。在该范围内,替换命令
#include
在行的开头匹配。替换命令是用
|
分隔符而不是通常的分隔符编写的/
,以允许模式和/或替换文本包含/
而不转义。这有助于可读性。
(此外,它不要求GNU sed
。)
修改后的命令也可以在 Vim 中使用,尽管您必须在 Vim 中用作命令/
的分隔符s///
。编辑器ed
将能够使用相同的命令sed
。