1

如何在每个多行范围块之前插入一行并在 Windows 上的 gnu sed 中缩进块?这些文件包含许多以 ``` 开头和结尾的不同长度的代码块。使用单线模式对许多类似问题的答案不使用范围。有两个类似的问题:在文本范围下方插入行 sedsed: Appending after a block

此代码根据需要缩进所有代码块:

sed '/```/,/```$/ s/\(.*\)/ \1/' test.md

我不明白如何===在每个代码块之前插入行,但我知道{}在插入行后处理块需要分组。上面的问题似乎更复杂,需要缓冲区,但这个文件应该能够在没有缓冲区的情况下按顺序处理。

我希望这样的尝试应该与组之前的换行细节一起使用:

sed '/```/,/```$/ {s/\(.*\)/ \1/}' test.md

测试.md

a
b
```
c
d
e
```
f
g

必需的

a
b
===
    ```
    c
    d
    e
    ```
f
g
4

1 回答 1

2

使用 GNU sed:

$ cat file
1
```
2
```
3
```
4
```
5
$ sed '/^```$/{ s/^/===\n    /; :a; n; s/^/    /; /^    ```$/b; ba; }' file
1
===
    ```
    2
    ```
3
===
    ```
    4
    ```
5

(酷炫的sedsed可以详细展示它的工作原理。)


使用 awk:

$ awk '/^```/ { if (!f) { print "===" } f++ } f { print "    " $0 } f==2 { f=0; next } !f' file
1
===
    ```
    2
    ```
3
===
    ```
    4
    ```
5
于 2021-10-28T04:10:14.637 回答