【问题标题】:Sed expression to convert only certain lines starting with some example phraseSed 表达式仅转换以某些示例短语开头的某些行
【发布时间】:2021-12-17 08:11:05
【问题描述】:

有一个带有常规文本的示例文件。在文档的某些地方混合了以下几行:

| ![](/img/2016/12/020.jakis-tam-text1.png#medium) | ![](/img/2016/12/021.jakis-tam-text2.png#medium) | ![](/img/2016/12/022.jakis-tam-text3.png#medium) |
| ![](/img/2016/12/020.jakis-tam-text1.png#medium) | ![](/img/2016/12/021.jakis-tam-text2.png#medium) |

有以下 sed 表达式可以将行转换为所需的形式:

sed 's#\([^[]*.\)\([^\.]*.\([^\.]*\)[^)]*.\)#\1\3\2#g'

如何将此 sed 表达式仅应用于以 | ![]( 开头的行?

【问题讨论】:

    标签: sed backreference


    【解决方案1】:

    您的模式不太正确:. 当未转义匹配任何字符时。另外,请注意您不需要在括号表达式中转义 . 字符。

    我建议使用以下命令:

    sed '/^|[[:space:]]!\[](/s#\(|[[:space:]]!\[\)\(]([^().]*\.\([^|.]*\)\.[^()]*)\)#\1\3\2#g'
    

    online demo

    这里,POSIX BRE 模式匹配

    • /^|[[:space:]]!\[](/ - 任何以 | 开头的行、空格,然后是 ![]( 文本
    • s#\(|[[:space:]]!\[\)\(]([^().]*\.\([^|.]*\)\.[^()]*)\)#\1\3\2#g -
      • \(|[[:space:]]!\[\) - 第 1 组 (\1):|,一个空格,![ 文本
      • \(]([^().]*\. - 第 2 组开始:](,然后是除 (). 之外的任何零个或多个字符,然后是 .(注意它是转义的)
        • \([^|.]*\) - 第 3 组 (\3):除 |. 之外的任何零个或多个字符
      • \.[^()]*)\) -(仍然是第 2 组):. 字符,然后是除 () 之外的零个或多个字符,然后是 ) 字符。

    替换是组 1、3 和 2 的串联。

    【讨论】:

      【解决方案2】:

      在您的s 命令前加上/| !\[](/

      [ 被解释为正则表达式,为避免这种情况,必须对其进行转义。

      【讨论】:

        猜你喜欢
        • 2022-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多