【问题标题】:Copy matched regex to new file将匹配的正则表达式复制到新文件
【发布时间】:2015-02-02 20:00:17
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是否使用正则表达式解析 XML?如果是这样,请期待问题。做 The Right Thing™ 并立即开始使用 XML 库。
  • grep(全局正则表达式打印)将允许您几乎可以抛出任何您想要的regexsed(流编辑器磁盘)使用它的 own 正则表达式语法,大多数更复杂的正则表达式模式需要为 sed 设置不同的格式
  • @MattGreen 这里的问题是多行,grep 不这样做(但它的表亲 pcregrep 可以)并且sed 需要一些看起来很奇怪的语法。但是不要告诉 OP,他们不应该为此使用正则表达式。
  • @Biffen 是的,但这是一个简单的 XML。我只需要按 过滤掉新项目。我看不出这里哪里有问题(不需要复杂的处理)。
  • @Adrian 你能以你认为神圣的东西发誓,输入的性质将永远改变吗?因为它只需要一些额外的空格或添加的属性就可以让你的正则表达式失败。甚至不要让我开始研究 cmets 和 CDATA 块。

标签: regex linux sublimetext2


【解决方案1】:

通常sedgrep 用于搜索行而不是多行模式,因为在某些条件下仍然可以。

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

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

请注意,如果您嵌套了&lt;shopitem&gt; 标签甚至多次出现,则此正则表达式将不起作用。而是使用 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

【讨论】:

  • 我有很多 元素,也许我最初的问题是在这里不行。我需要处理 XML 文件以过滤掉 为 2015 的 元素。
  • 这个 perl 解决方案看起来不错,但由于某种原因,输出与输入相同(未进行任何处理)。
  • chmod 不需要执行脚本。如果您调用解释器(bash、python、php 等),只有读取权限就足够了。我认为这更实用:$ perl myparser.pl myfile.xml
  • @Adrian 你能提供一个你的 XML 代码的例子吗?
【解决方案2】:

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

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

编辑:我没有匹配正则表达式,而是得到带有 YEAR 2015 标记的 SHOPITEM,并删除了所有不需要的部分。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 2011-05-15
    • 2013-02-11
    • 1970-01-01
    相关资源
    最近更新 更多