perl one liner +如何过滤文件

时间:2014-07-13 09:19:56

标签: regex linux bash perl

背景:我的目标是过滤包含单词

的文件

我想打印包含旧词(大写或小写字母)的文件的所有文件,

根据以下规则:

如果Az-zZ在旧名称之前或在旧名称之后,则应打印行

如果Az-Zz位于旧名称之后且旧单词之前,则应打印行

如果0-9位于旧名称之后且旧单词之前,则应打印行

如果0-9在旧名称之前,之后是非Az-zZ或0-9则不应打印行

如果0-9在旧名称之后且之前是非Az-zZ或0-9则不应打印行

实施例

  /DIR3/DATA/A4/Via/OOld/TriR.txt            --> should  be print
  /DIR4/DATA/A4/Via/AOld1/Comne.txt          --> should be print
  /DIR5/DATA/A4/Via/BOld/TriR.txt     --> should be print
  /DIR5/DATA/A4/Via/aOld/TriR.txt      --> should be print
  /DIR5/DATA/A4/Via/1OldA/TriR.txt      --> should be print
  /DIR5/DATA/A4/Via/POld1/TriR.txt      --> should be print
  /DIR4/DATA/A4/Via/1Old1/Comne.txt    --> should  be print
  /DIR4/DATA/A4/Via/1Old1/Comne.txt    --> should  be print
  /DIR4/DATA/A4/Via/Comne.txt    --> should  be print


  /DIR1/DATA/A4/Via/5Old/CentalS.txt   --> should not be print
  /DIR4/DATA/A4/Via/Old1/Comne.txt    --> should not be print
  /DIR1/DATA/A4/Via/Old/CentalS.txt   --> should not be print
  /DIR4/DATA/A4/Via/Old11/Comne.txt    --> should not be print
  /DIR4/DATA/A4/Via/OLD@/Comne.txt    --> should not be print
  /DIR4/DATA/A4/Via/.OLd/Comne.txt    --> should not be print
  /DIR4/DATA/A4/Via/home/Comne.Old_txt    --> should not be print
  /DIR4/DATA/A4/Via/home/Comne.old_txt    --> should not be print
  /DIR4/DATA/A4/Via/home/Comne.0old_txt    --> should not be print
  /DIR4/DATA/A4/Via/home/Comne.old6_txt    --> should not be print
  /DIR4/DATA/A4/Via/home/Comne___0old_txt    --> should not be print

请通过perl one liner line告知如何实现这一点 语法

 echo $PATH | perl one liner line

2 个答案:

答案 0 :(得分:2)

如果文件路径在单个文件中,则可以编写

perl -ne'$w='old';print if /[a-z]$w|$w[a-z]|[0-9]$w[0-9]/i' myfile

或者,如果您愿意

perl -ne'print if /(.)old(.)/i && "$1$2" =~ /[a-z]|[0-9]{2}/i' myfile

实际上,您似乎想要过滤掉PATH环境变量的成员,因此您需要

perl -E'say for grep /(.)old(.)/i && "$1$2" =~ /[a-z]|[0-9]{2}/i, split /:/, $ENV{PATH}'

<强>更新

我误解了你的问题。这应该适合你

perl -lnE'/(.)old(.)/i && "$1$2" !~ /[a-z]|[0-9]{2}/i or say for /[^:]+/g'

我不理解您对管道PATH以及指定给定路径的要求,因此这适用于任何一种。您也可以在命令

之后输入一个输入文件

答案 1 :(得分:1)

而不是echo $PATH |,让我们使用echo "${PATH//:/$'\n'}" |(找到here),逐行打印路径。你可以用这个单行标记:

perl -ne 'if($_=~m/^(?!.*old).*|^.*?(?:[a-z]old|\dold[a-z\d]).*/i){print "$&\n";}'

可以缩短为

perl -ne 'print if m/^(?!.*old).*|^.*?(?:[a-z]old|\dold[a-z\d]).*/i'

选项2

这个应该直接与echo $PATH

一起使用
perl -ne 'while(/(?:^|\G:\K)(?:(?!.*old)[^:]+|[^:]*?(?:[a-z]old|\dold[a-z\d])[^:]*)/ig){print "$&\n";}'