背景:我的目标是过滤包含单词旧
的文件我想打印包含旧词(大写或小写字母)的文件的所有文件,
根据以下规则:
如果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
答案 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";}'