Sed 表达式仅转换以某些示例短语开头的某些行

Sed expression to convert only certain lines starting with some example phrase

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

| ![](/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#\([^[]*.\)\([^\.]*.\([^\.]*\)[^)]*.\)##g'

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

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

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

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

我建议使用以下命令:

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

参见 online demo

此处,POSIX BRE 模式匹配

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

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