Perl one-liner:删除带有模式匹配的行

时间:2015-11-28 17:27:13

标签: perl

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

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

我尝试编写C-shell脚本,这是代码:

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

这不起作用,但是当我使用没有变量的单行程序(abc12)时,它可以工作。

我不确定模式匹配是否有问题,或者是否还有其他错误。

2 个答案:

答案 0 :(得分:11)

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

当然,你效率非常低,因为你多次处理每个文件。

如果您要将abc12行移至abc17,您可以一次性完成此操作:

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

答案 1 :(得分:-2)

试试这个

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

使用范围 [2-7] 只需要输入 [234567],它可以为您节省三个按键。

man 1 bash:模式匹配

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

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