sed 正则替换——根据 HTML标签的开始标签自动补全结束标签

在我使用 markdown 写作时,需要批量给某些 vim 命令(命令中没有空格)添加上css效果。如下面这段:

这是这个例子中另一个技巧。 f{char} 命令让 Vim 往前寻找下一个指定字符,如果找到,就将光标直接移动到它(见 :h f [ⓘ](http://vimhelp.appspot.com/motion.txt.html#f))。所以当我们输入 f+ 我们的光标直接移动到下一个 + 号上。

需要变为:

这是这个例子中另一个技巧。 <span class="keystroke">f{char}</span> 命令让 Vim 往前寻找下一个指定字符,如果找到,就将光标直接移动到它(见 :h f [ⓘ](http://vimhelp.appspot.com/motion.txt.html#f))。所以当我们输入 <span class="keystroke">f+</span> 我们的光标直接移动到下一个 + 号上。

通常我是直接在 vscode 中批量选中所有 vim 命令的第一个字符的前面:

image-20221115204446614

然后一次性输入所有开始标签:

image-20221115204610673

但接下来要输入结束标签就不太好办了,因为很难通过手工操作一次到所有命令的最后一个字符的后面。
image-20221115204749273

所以,我想到用 sed 来帮助完成自动补全结束标签。

sed

替换模式如下:

s/\(<\([^> ]*\)[> ][^< ]*\) /\1<\/\2> /g

注意:

  • Sed 中 () 都要转义
  • sed 不支持 (xxx|xxx) 这种写法,只支持 []

在命令行测试一下:

$ echo '这是这个例子中另一个技巧。 <span class="keystroke">f{char} 命令让 Vim 往前寻找下一个指定字符,如果找到,就将光标直接移动到它(见 :h f [ⓘ](http://vimhelp.appspot.com/motion.txt.html#f))。所以当我们输入 <span class="keystroke">f+ 我们的光标直接移动到下一个 + 号上。' | sed 's/\(<\([^> ]*\)[> ][^< ]*\) /\1<\/\2> /g'
这是这个例子中另一个技巧。 <span class="keystroke">f{char}</span> 命令让 Vim 往前寻找下一个指定字符,如果找到,就将光标直接移动到它(见 :h f [](http://vimhelp.appspot.com/motion.txt.html#f))。所以当我们输入 <span class="keystroke">f+</span> 我们的光标直接移动到下一个 + 号上。

文件中效果:

image-20221115205253882

Javascript

str.replace(/(<([^> ]*)[> ][^< ]*) /g, "$1</$2>")

image-20221115205747145

本作品采用《CC 协议》,转载必须注明作者和本文链接
日拱一卒
讨论数量: 3

试试 sed -E。区别:www.gnu.org/software/sed/manual/ht...

3周前 评论
hustnzj (楼主) 3周前

感谢 @wxf666 指点,加上 -E 就可以使用扩展正则的语法,节约了不少事。。。 测试如下: file

$ echo '这是这个例子中另一个技巧。 <span class="keystroke">f{char} 命令让 Vim 往前寻找下一个指定字符,如果找到,就将光标直接移动到它(见 :h f [ⓘ](http://vimhelp.appspot.com/motion.txt.html#f))。所以当我们输入 <span class="keystroke">f+ 我们的光标直接移动到下一个 + 号上。' | sed 's/(<([^> ]*)?(>| )[^< ]*) /\1<\/\2> /g'
sed: 1: "s/(<([^> ]*)?(>| )[^< ] ...": \1 not defined in the RE

$ echo '这是这个例子中另一个技巧。 <span class="keystroke">f{char} 命令让 Vim 往前寻找下一个指定字符,如果找到,就将光标直接移动到它(见 :h f [ⓘ](http://vimhelp.appspot.com/motion.txt.html#f))。所以当我们输入 <span class="keystroke">f+ 我们的光标直接移动到下一个 + 号上。' | sed 's/\(<\([^> ]*\)?\(>| \)[^< ]*\) /\1<\/\2> /g'
这是这个例子中另一个技巧。 <span class="keystroke">f{char} 命令让 Vim 往前寻找下一个指定字符,如果找到,就将光标直接移动到它(见 :h f [](http://vimhelp.appspot.com/motion.txt.html#f))。所以当我们输入 <span class="keystroke">f+ 我们的光标直接移动到下一个 + 号上。

$ echo '这是这个例子中另一个技巧。 <span class="keystroke">f{char} 命令让 Vim 往前寻找下一个指定字符,如果找到,就将光标直接移动到它(见 :h f [ⓘ](http://vimhelp.appspot.com/motion.txt.html#f))。所以当我们输入 <span class="keystroke">f+ 我们的光标直接移动到下一个 + 号上。' | sed -E 's/(<([^> ]*)?(>| )[^< ]*) /\1<\/\2> /g'
这是这个例子中另一个技巧。 <span class="keystroke">f{char}</span> 命令让 Vim 往前寻找下一个指定字符,如果找到,就将光标直接移动到它(见 :h f [](http://vimhelp.appspot.com/motion.txt.html#f))。所以当我们输入 <span class="keystroke">f+</span> 我们的光标直接移动到下一个 + 号上。
3周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
93
粉丝
83
喜欢
150
收藏
121
排名:67
访问:11.4 万
私信
所有博文
社区赞助商