正则表达式替换markdown文件代码块标记中的所有空格

Posted

技术标签:

【中文标题】正则表达式替换markdown文件代码块标记中的所有空格【英文标题】:Regex to replace all spaces in the code block marker of markdown file 【发布时间】:2021-08-29 14:43:59 【问题描述】:

我想在每个降价文件的代码块标记中用一个逗号替换每组空格。

例如我有这个代码块:

```html   class1 class2

注意上面一行有两组空格,一组有3个空格,另一组有一个空格。

我想将其替换为:

```html,class1,class2

我尝试了以下命令但没有成功:

find src -type f -name "*.md" -exec sed -i s/^(?<=```)( )+/,/g  +

含义:如果一行的开头包含 ``` 则用逗号替换所有空格。 但它不起作用。

我应该在这里使用什么正确的命令?

【问题讨论】:

您需要使用-E 来使用像()+ 这样的元字符,并且sed 不支持环视。另见:Why does my regular expression work in X but not in Y? my answer 为您工作了吗?您需要更多帮助吗? 【参考方案1】:

你可以使用

sed -E '/^```/ s/[[:space:]]+/,/g' file

查看online demo

详情

-E 启用 POSIX ERE 语法 /^```/ - 如果该行以 ``` 开头,则继续执行后续命令 s/[[:space:]]+/,/g - 用一个 , 字符替换一个或多个空格。
s='```html   class1 class2
html   class3 class4'
sed -E '/^```/ s/[[:space:]]+/,/g' <<< "$s"

输出:

```html,class1,class2
html   class3 class4

【讨论】:

@TuyenPham 欢迎您提出一个有趣的问题。【参考方案2】:

这会做到(使用 GNU sed):

sed '/^```/ s/\s\+/,/g' your_file

它的工作方式如下:

对于以三个反引号开头的行.../^```/ 替换所有(g 表示全局替换)出现的一个或多个空格 (\s 表示空格,\+ 表示一个或多个)带逗号

一旦您确认它符合您的要求,只需添加 -i 即可 就地替换:

sed -i '/^```/ s/\s\+/,/g' your_file

【讨论】:

【参考方案3】:

在每个 Unix 机器上的任何 shell 中使用任何 awk:

$ awk -v OFS=',' '/^```/$1=$1 1' file
```html,class1,class2

如果您想进行“就地”编辑(就像您使用 GNU sed for sed -i 一样)然后使用 GNU awk 并使其成为 awk -i inplace -v OFS=',' '/^```/$1=$1 1' file

【讨论】:

以上是关于正则表达式替换markdown文件代码块标记中的所有空格的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式替换 C 块注释之间的字符串

如何避免使用 Python re 库删除文本文件中正则表达式标志之间的文本块?

通过正则表达式删除嵌套在多个 html 标记中的特定单词

如何使用正则表达式匹配从 xml 文件中搜索和替换包含占位符标记的文本。 VB.net 或 C#

使用正则表达式替换 Pre 标记内的 Html

notepad++正则表达式替换,在匹配文本前插入字符,如何做到?