【问题标题】:Insert Line with SED Before Each Multiline Range在每个多行范围之前插入带有 SED 的行
【发布时间】:2021-12-13 04:52:30
【问题描述】:

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

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

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

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

我希望这样的尝试应该适用于组之前的换行细节:

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

test.md

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

必填

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

【问题讨论】:

    标签: windows sed gnu-sed


    【解决方案1】:

    使用 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
    

    【讨论】:

    • 不错。评论 1) Windows 上的 GNU sed 需要 ^^(即转义) 2) 如果在 ``` 删除第一个 $ 之后给出代码语言。你能描述一下新的sed 命令吗?
    • “新” sed 命令? “的” sed 命令?请使用 sed 调试器sedsed.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多