【问题标题】:sed - replace multiline string between patterns in different linessed - 在不同行的模式之间替换多行字符串
【发布时间】:2021-06-15 08:39:17
【问题描述】:

我有几个 .sql 文件包含标记为“/* */”的 cmets 注释可以在同一行开始和结束,但大多是多行注释。

[更新]示例:

    /*=======WHATEVER=======*/
    SELECT * FROM TABLE 
    WHERE
        /* PERIOD_DTE IN
                (SELECT MAX(PERIOD_DTE) 
                 FROM TABLE WHERE PERIOD_DTE < '1900-01-01')
                 AND FIELD1 = 100
                 AND FIELD2 IS NULL
        */
    FIELD3 IS NULL

是否可以使用 sed 函数将这种注释替换为空字符串?

【问题讨论】:

  • 我不知道 SQL,所以您能否更新问题中的示例以显示任何单行 cmets 在您的用例中的外观?谢谢
  • 当然 :) 示例已更新。

标签: sql shell sed


【解决方案1】:

这将适用于您的示例(使用 GNU sed):

sed 's_\*/_\n*/_' your_file | sed '/\/\*/,/\*\//d'

它的工作方式如下:

  • 在第一个命令中,我使用_ 作为模式分隔符以避免需要 转义 \ 字符。
  • 第一个命令将任何单行注释分成多行 注释,以便我们可以在第二个命令中处理一种情况。
  • 第二条命令删除所有内容,包括行间匹配 模式/**/

所以对于示例输入:

SELECT * FROM TABLE 
WHERE
    /* PERIOD_DTE IN
            (SELECT MAX(PERIOD_DTE) 
             FROM TABLE WHERE PERIOD_DTE < '1900-01-01')
             AND FIELD1 = 100
             AND FIELD2 IS NULL
    */
    /* SINGLE LINE COMMENT */
FIELD3 IS NULL

所以这两个步骤是:

sed 's_\*/_\n*/_' your_file

输出:

SELECT * FROM TABLE
WHERE
    /* PERIOD_DTE IN
            (SELECT MAX(PERIOD_DTE)
             FROM TABLE WHERE PERIOD_DTE < '1900-01-01')
             AND FIELD1 = 100
             AND FIELD2 IS NULL

*/
    /* SINGLE LINE COMMENT
*/
FIELD3 IS NULL

sed '/\/\*/,/\*\//d'

输出:

SELECT * FROM TABLE
WHERE
FIELD3 IS NULL

【讨论】:

  • 非常感谢!当 sql 文件看起来像示例中的文件时,它可以完美运行。当然,我们的业务用户在文件的开头放置了一行注释 :) - 所以我在文件的开头有一个单行注释,在文件的某个位置有一个多行注释。在这种情况下,您的解决方案会删除两个 cmets 之间的所有代码 - 如果我理解正确,我们需要先删除单行注释,然后再删除多行注释?
  • @Darkeue 我在更新的示例上尝试了我的命令,它似乎有效?我还在FIELD3 IS NULL 行之后添加了第二条多行注释,它也有效吗?所以我不明白你的意思是什么,所以我的解决方案删除了​​两个 cmets 之间的所有代码?
  • 我首先使用 m_cat 来读取文件,然后我使用您的解决方案,结果只是“FIELD3 IS NULL”——只有最后一行代码。 m_cat 有问题吗?
  • @Darkeue 我对 m_cat 不熟悉,所以无法回答,抱歉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 2016-03-22
  • 1970-01-01
相关资源
最近更新 更多