我有string
Message <Network=Data Center> All Verified
我需要提取除括号之外的所有string
我试过了
m/(?![^<]*\>)/s
没有给出预期的结果。
我怎样才能取代在Linux中的特定文件夹中find的所有电子邮件地址
Linux正则expression式匹配非常大的文件没有换行符后添加新行
如何使用linux的csplit来砍断大量的XML文件?
在.htaccess中删除GET参数
在C中转换转义序列
使用perl而不是grep
在.htaccess中为带有后缀的所有url设置redirect
当扩展正则expression式(ERE)选项与sed一起使用时,为什么美元不符合字面美元?
删除<..>区域
从字符串中删除<..>部分,然后处理剩下的字符串更容易。
试试这个oneliner:
cat file | perl -pne 's/<[^>]*?>//g;'
对于您的示例输入,这是输出:
Message All Verified
注意非贪婪的量词 ? 在正则表达式中使用。 另外,因为这是一个oneliner,所以s/// search-and-replace结构被应用于$_隐式变量(这是一个来自标准输入的行)。 所以在搜索和替换运行后, $_将被改变(将不会有<..>区域)。 另外,为了在运行代码块之后打印变量$_ ,还使用了-p 。 您可以在perlrun中阅读关于Perl命令行开关的更多信息。
捕获<..>之外的区域
另一方面,你可以(如果你想)匹配<..>区域以外的部分。
为了做到这一点,让我们建立一个正则表达式。 首先,我们要一个<或>自由区域。 下面的正则表达式匹配
$p = ([^<>]*) 。
接下来,我们希望在<之前匹配所有内容,为此我们可以编写(?:$p<)和>之后的所有内容,即(?:>$p) 。
现在,如果我们将所有这些部分组合在一起,我们得到(?:>$p)|(?:$p<) 。
注意(?:)是一个非捕获组。
所以现在有两个捕获组(两个$p你看到上面),但只有一个将匹配一次,所以一些捕获将是undef 。 我们将不得不将这些过滤掉。
最后,我们可以组装所有的捕获,我们就完成了。
cat file | perl -ne '$p="([^<>]*)";@x=grep{defined} m{(?:>$p)|(?:$p<)}g; print join(" ",@x)."n";'
Parse::Yapp解析器
你可能会认为使用Parser::Yapp这个特定的问题有点太多了(通常,如果你有一些复杂的解析,你会使用语法和解析器生成器 ),但..为什么不.. ..
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。