【问题标题】:Perl one-liner: deleting a line with pattern matchingPerl one-liner:使用模式匹配删除一行
【发布时间】:2020-12-30 00:39:55
【问题描述】:

如果文件中的多行与可变的特定模式匹配,我会尝试删除它们。

我正在尝试删除与 abc12、abc13 等匹配的行。

我尝试编写一个 C-shell 脚本,代码如下:

    **!/bin/csh
    foreach $x (12 13 14 15 16 17)
    perl -ni -e 'print unless /abc$x/' filename
    end**

这不起作用,但是当我使用不带变量的单线 (abc12) 时,它起作用了。

我不确定模式匹配是否有问题,或者我是否缺少其他东西。

【问题讨论】:

  • perl -i -ne '/abc1[234567]/ or print' filename

标签: perl


【解决方案1】:

是的,这是您使用单引号的事实。这意味着 $x 是按字面意思解释的。

当然,您这样做的效率非常低,因为您要多次处理每个文件。

如果您希望删除行 abc12abc17,您可以一次性完成所有操作:

perl -n -i.bak -e 'print unless m/abc1[234567]/' filename

【讨论】:

  • 理想情况下,如果您有一个满足您需求的答案,您应该接受它。 (旁边的那个小勾)
  • 对不起,我不知道,我是新来的,谢谢你的提示。
  • 如何删除这条匹配的下一行?
  • 恐怕采用不同的方法。值得将其作为一个单独的问题提出。以上仅适用于逐行。
【解决方案2】:

试试这个

perl -n -i.bak -e 'print unless m/abc1[2-7]/' filename

使用范围 [2-7] 只需要键入 [234567],这样可以节省您的三个击键次数。

man 1 bash:模式匹配

[...] 匹配任何一个包含的字符。由连字符分隔的一对字符表示范围表达式;使用当前语言环境的整理序列和字符集在这两个字符之间排序的任何字符都匹配。如果 [ 之后的第一个字符是 !^ 则匹配任何未包含的字符。

- 可以通过将其作为集合中的第一个或最后一个字符来匹配。 ] 可以通过将其作为集合中的第一个字符来匹配。

【讨论】:

  • 欢迎您,感谢您提供答案。您能否编辑您的答案以包括对您的代码的解释?这将有助于未来的读者更好地了解正在发生的事情,尤其是那些刚接触该语言并难以理解概念的社区成员。
猜你喜欢
  • 1970-01-01
  • 2012-08-01
  • 2014-07-31
  • 1970-01-01
  • 2016-11-22
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多