使用sed匹配并打印多行

时间:2012-02-22 20:07:01

标签: regex sed multiline

我正在尝试匹配以下内容: 模式以/*开头,以*/\n(override\s+)public结尾,尝试执行以下操作:

sed -n '/\/\*/,/\*\/\n(override\s+)public/p' file

在这里,我问你如何写得恰到好处:)

如果可以使用grep或awk - 这是一个选项,如果它是perl中的单行,那也没关系。

PS。我不确定sed正则表达式语法,但\s意味着是一个空格,理想情况是[\ \t\r\n]

编辑:

假设你有:

/**
 * Some comment goes here
 */
override public function ...

/**
 * A comment for another function
 */
public function ...

表达式会给你这两个结果:

/**
 * Some comment goes here
 */
override public

/**
 * A comment for another function
 */
public

编辑: 更好的是,如果有人可以将下面的正则表达式转换为sed,那就可以完成这项工作。

/\/\*(!?\*\/)*\*\/\s*(overrides\s+)?public/gm

注意,m标志表示正则表达式是多行的,即负向前瞻组也将匹配行结束。但如果这不可能,但仍然可以匹配行结束,那么表达式将如下所示:

/\/\*((!?\*\/)*$)*\*\/[\r\n\t\ ]*(overrides[\r\n\t\ ]+)?public/g

1 个答案:

答案 0 :(得分:2)

我认为这会做你想做的事情:

perl -0777 -n -e '
    for (m/(\/\*.*?\*\/\s+(override\s+)?public)/s) { 
        print "$1\n"; 
    }
' file

-0777是“一次读取所有file”的perl约定,而不是默认的逐行。

-n告诉perl 打印输入文件(而不是打印它的-p)。

-e告诉perl从命令行读取程序。

正则表达式很大程度上就像你写的一样,虽然我删除了逗号位,因为不清楚你想要做什么。我使用了不情愿的*?量词来匹配最短的匹配,以及s标记,该标记将整个文件视为“单行”,这意味着.*?匹配跨行边界否则不会。

如果正则表达式匹配,m子句中的if会导致表达式求值为true。表达式末尾的s将输入视为单行。在if子句中,我们正在打印$1,这是正则表达式匹配的第一个。如果您想要打印第二组,请使用$2

更新:更改了论坛,以便打印出overridepublic,根据您的修改设置override可选,更改为iffor所以它匹配模式的多个实例。