我使用perl检查正则表达式模式的一些文本输入,但是一种模式不适用于perl -pe
。
以下模式不适用于命令调用:
s![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)/.*!$1!
我使用的是linux shell。接下来我用来测试我的正则表达式:
cat test | perl -pe 's![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)/.*!$1!'
文件测试:
A MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp A MaintanceGie?\195?\159mannFlock/System/Comp-Cache/abc.h
结果:
A MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp Cache
如何删除第一个结果?
感谢您的任何建议。
答案 0 :(得分:3)
在“Comp - (。*)”之后的最后一次斜线可能是正在做的事情。 “数据库”中的文件内容没有斜杠。尝试将Comp-(.*)/.*
替换为Comp-(.*)[/.].*
,以便您可以匹配子目录或文件扩展名。
答案 1 :(得分:2)
$ cat input A MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp A MaintanceGie?\195?\159mannFlock/System/Comp-Cache/abc.h $ perl -ne 'print if s![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)/.*!$1!' input Cache
答案 2 :(得分:1)
问题在于正则表达式中的最后一个斜杠字符。它不是转义点,而是正常的斜杠字符,输入字符串中缺少该字符。试试这个:
s![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)[./].*!$1!
修改:已更新以匹配新输入数据并添加了另一个选项:
另一方面,您的替换正则表达式可能会被替换为:
perl -ne 'print "$1\n" if /Comp-(.*?)[.\/]/'
然后就不需要用它包含的任何东西来解析整行。
答案 3 :(得分:1)
\ s匹配空格(空格,制表符和换行符),“+”表示一个或多个字符。在这种情况下,'\ s +'意味着搜索一个或多个空格。
cat test
A MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp
A MaintanceGie?\195?\159mannFlock/System/Comp-Cache/abc.h
perl -ne 'print "$1\n" if /\w+?\d+?\d+\w+\/\w+\/Comp-(\w+)[\/]/' test