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

时间:2015-02-02 20:00:18

标签: regex linux sublimetext2

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

<SHOPITEM>([\s\S]*?)<YEAR>2015<\/YEAR>([\s\S]*?)<\/SHOPITEM>

([\s\S]*?) =任何文字,任意行

这在Sublime编辑器中有效(我能找到),但这个正则表达式如何查找sed / grep(或任何其他Unix工具)?

2 个答案:

答案 0 :(得分:1)

通常使用sedgrep来搜索不在多线模式下的线路,因为在某些条件下仍然可以。

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

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

请注意,如果嵌套<shopitem>标记甚至多次出现,则此正则表达式将不起作用。而是使用XML解析器。

此外,您可以编写一个解析xml文件的程序,这次它将捕获所有匹配项。

myparser.pl:

#!/usr/bin/env perl
undef $/;
$_ = <>;
print while(/<(shopitem)>[\s\S]*<(year)>2015<\/\2>[\s\S]*<\/\1>/ig);

你可以执行:

$ chmod u+x myparser.pl
$ ./myparser.pl myfile.xml

答案 1 :(得分:0)

我不是最好的脚本编写者,但我认为这应该有效:

grep "<SHOPITEM>" infile | grep "<YEAR>2015"  | sed -e "s/<[^>]*>//g" | sed "s/2015/ /g" > outfile

编辑:我与正则表达式不匹配,而是使用YEAR 2015标签获取了SHOPITEM并删除了所有不需要的部分。

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