我有一个 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-data
letsed
将输入视为单行(实际上,由空字符分隔的行),然后查找 ``-text-``` 序列以将其替换为 ``bash-text-```。
答案3
我会尝试类似的东西
perl -ple 'if (m/^```$/) { if (--$|) { s/$/bash/ } }' data.md
答案4
您可以尝试在命令中使用单引号sed
:
sed 's/^(```)/(```bash)/g'
这用于避免解释 bash 中的符号
但根据你的文件,你最好使用类似的东西:
sed 's/^```/```bash/g'