我正在尝试匹配以下内容:
模式以/*
开头,以*/\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
答案 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
。
更新:更改了论坛,以便打印出override
和public
,根据您的修改设置override
可选,更改为if
到for
所以它匹配模式的多个实例。