我想将正则表达式匹配的文本复制到新文件中。
<SHOPITEM>([\s\S]*?)<YEAR>2015<\/YEAR>([\s\S]*?)<\/SHOPITEM>
([\s\S]*?)
=任何文字,任意行
这在Sublime编辑器中有效(我能找到),但这个正则表达式如何查找sed / grep(或任何其他Unix工具)?
答案 0 :(得分:1)
通常使用sed
和grep
来搜索不在多线模式下的线路,因为在某些条件下仍然可以。
我建议使用应安装在您计算机上的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并删除了所有不需要的部分。
编辑:我这样做,但我不确定这是最优雅的解决方案。