将双```` 对的开头```` 替换为````bash

将双```` 对的开头```` 替换为````bash

我有一个 markdown 文件,其中包含代码块:

在[310]中:!cat data.md

**File Permission Related Commands**

These commands are used to change permissions of the files

```
72. chmod octal file-name                : Changes the permissions of file to octal
    chmod 777 /data/test.c                   : Sets rwx permission for owner , group and others
```

**Network Related Commands**

These commands are used to view and edit network configurations related aspects of the system

```
75. ifconfig -a        : Displays all network interface and set ip address
76. ifconfig eth0      : Displays eth0 ethernet port ip address and details
```

**Compression / Archive Related Commands**

These commands are used to compress and decompress files

```
89. tar cf home.tar  home         : Creates a tar named home.tar containing home/
    tar xf file.tar               : Extracts the files from file.tar
    tar czf  file.tar.gz  files   : Creates a tar with gzip compression

我想将开头```(三重洞穴)替换为```bash标记 shell 脚本,该脚本将由编辑器以颜色演示。

我尝试了答案。

In [327]: !sed 's/^(```)/(```bash)/g' data.md                                                                     
**File Permission Related Commands**

These commands are used to change permissions of the files

```
72. chmod octal file-name                : Changes the permissions of file to octal
    chmod 777 /data/test.c                   : Sets rwx permission for owner , group and others

但开口```没有更换。

我怎样才能完成这样的任务呢?

答案1

```要将所有其他行替换为```bash,使用 awk 可能更容易:

awk '$0 == "```" && alt = 1 - alt {$0 = "```bash"}; {print}' < file

取代每一个 ```线,那就是:

sed 's/^```$/&bash/'

当它是整个匹配时,不需要显式地捕获匹配(顺便说一句,这是用\(...\);完成的,只有在使用or 的某些实现(...)支持的扩展正则表达式后才起作用),因为整个匹配都是捕获的。sed-E-r&

不需要g旗帜。该g标志将替换所有出现的情况在线上,但在这里,每行只能出现一次,因为我们使用 和 将模式锚定到行的开头和^结尾$

sed, 替换所有其他线,你可以这样做:

sed '
  /^```$/ {
    s//&bash/;:1
    n;//!b1
  }'

一行:

sed -e '/^```$/ {s//&bash/;:1' -e 'n;//!b1' -e '}'

通过 GNU 实现sed,您可以将其缩短为:

sed '/^```$/{s//&bash/;:1;n;//!b1}'

(但这不是 POSIXly 的标准语法,在, 或命令sed之后不能有任何代码,并且之前需要有或 换行符)。:b;}

答案2

编辑

该命令sed 's/^(```)/(```bash)/g'不起作用,因为圆括号是按字面解释的。
您可能必须转义圆括号,如下所示

$ sed 's/^\(```\)/```bash/g'

或者,您可以启用扩展正则表达式:

$ sed -E  's/^(```)/```bash/g'

这样就不需要转义圆括号。

或者,只需删除圆括号:

$ echo '```' | sed 's/^```/```bash/g'
```bash

要仅匹配开头,```您可以使用如下正则表达式:

$ sed --null-data -E 's/[`]{3,3}([^`]*)([`]{3,3}){0,1}/```bash\1\2/g'

警告:如果在三个反引号序列之间找到`(反引号),则会失败。

它使用--null-dataletsed将输入视为单行(实际上,由空字符分隔的行),然后查找 ``-text-``` 序列以将其替换为 ``bash-text-```。

答案3

我会尝试类似的东西

 perl -ple 'if (m/^```$/) { if (--$|) { s/$/bash/ } }' data.md

答案4

您可以尝试在命令中使用单引号sed

sed 's/^(```)/(```bash)/g'

这用于避免解释 bash 中的符号

但根据你的文件,你最好使用类似的东西:

sed 's/^```/```bash/g'

相关内容