Regex 将匹配的正则表达式复制到新文件

Regex 将匹配的正则表达式复制到新文件,regex,linux,sublimetext2,Regex,Linux,Sublimetext2,我想将正则表达式匹配的文本复制到新文件中 <SHOPITEM>([\s\S]*?)<YEAR>2015<\/YEAR>([\s\S]*?)<\/SHOPITEM> ([\s\s]*?)2015([\s\s]*?) ([\s\s]*?)=任何文本、任何行 这在Sublime editor中是有效的(我可以找到),但是这个正则表达式如何查找sed/grep(或任何其他Unix工具)?通常sed和grep用于在非多行模式的行上搜索,因为在某些条件下仍

我想将正则表达式匹配的文本复制到新文件中

<SHOPITEM>([\s\S]*?)<YEAR>2015<\/YEAR>([\s\S]*?)<\/SHOPITEM>
([\s\s]*?)2015([\s\s]*?)
([\s\s]*?)
=任何文本、任何行


这在Sublime editor中是有效的(我可以找到),但是这个正则表达式如何查找sed/grep(或任何其他Unix工具)?

通常
sed
grep
用于在非多行模式的行上搜索,因为在某些条件下仍然可能

我建议使用Perl,它应该安装在您的计算机上:

perl -p -e 'undef $/;$_=<>;print $& if /<SHOPITEM>([\s\S]*?)<YEAR>2015<\/YEAR>([\s\S]*?)<\/SHOPITEM>/i;'

我不是最好的编剧,但我认为这应该行得通:

grep "<SHOPITEM>" infile | grep "<YEAR>2015"  | sed -e "s/<[^>]*>//g" | sed "s/2015/ /g" > outfile
grep“infle | grep”2015“| sed-e”s/]*>//g“| sed”s/2015//g”>输出文件
编辑:我没有匹配正则表达式,相反,我得到了带有2015年标签的SHOPITEMs,并删除了所有不需要的部分


编辑:我会这样做,但我不确定这是不是最优雅的解决方案。

您是否使用正则表达式解析XML?如果是这样的话,就要预料到问题。做正确的事™ 并立即开始使用XML库。
grep
(全局正则表达式打印)将允许您几乎抛出任何想要的
regex
sed
(流编辑器磁盘)使用它的正则表达式语法,对于
sed
@MattGreen,大多数更复杂的正则表达式模式需要不同的格式。这里的问题是多行,这是
grep
不做的(但它的表亲
pcregremp
做的)对于它,
sed
需要一些非常奇怪的语法。但是不要告诉OP这些,他们无论如何都不应该使用正则表达式来做这些事情。@Biffen是的,但这是一个简单的XML。我只需要按筛选出新项目。我看不出哪里会有问题(不需要复杂的处理)。@Adrian你能发誓你认为神圣的东西,输入的性质永远不会改变吗因为你的正则表达式失败只需要一些额外的空格或添加属性。甚至不要让我开始评论和CDATA块。我有很多元素,也许我最初的问题是这里不行。我需要处理XML文件以过滤掉2015中的元素。这个perl解决方案看起来不错,但由于某些原因,输出与输入相同(没有进行任何处理)。
chmod
不需要执行脚本。如果调用解释器(bash、python、php等),只有读取权限就足够了。我认为这更实用:
$perl myparser.pl myfile.xml
@Adrian您能提供一个xml代码的示例吗?
$ chmod u+x myparser.pl
$ ./myparser.pl myfile.xml
grep "<SHOPITEM>" infile | grep "<YEAR>2015"  | sed -e "s/<[^>]*>//g" | sed "s/2015/ /g" > outfile