2012-10-02 20 views
0

我对正则表达式很陌生,因此我的确设想这是一个相当简单的问题来回答,并且必须多次提问,但很遗憾,我找不到任何答案。如何列出名称中包含数字的文件并检索数字?

给定一个目录,我需要其所有子目录的名称都遵守模式“nw = [number] .a = [number]”的列表,并且对于每个需要检索这些数字的目录并执行一些操作基于这些的东西。其中一些目录是nw = 82.a = 40,nw = 100.a = 9,ecc。

我的猜测来完成,这将是

#! /bin/bash 

cd $mydir 
for dir in `ls | grep nw=[:digit:]+.a=[:digit:]`: do 
    retrieve the numbers 
    a few things 
done 

为什么它不工作,我怎么能检索的数字?

谢谢你在前进, 费迪南

回答

2
引号之间的正则表达式

享受。

调用终端的ls命令并将列表存储在数组@a中。

@a=`ls`; 

寻找匹配

m/ 

NW =(数字,我捕捉到$ 1)。A =从图案

(?{ 

打印第一数量,选项卡,第二数量,换行符

print"$1\t$2\n"}) 

端部内(数字我捕捉$ 2)的代码

nw=(\d+)\.a=(\d+) 

开始评价配对图案组

/ 

在阵列执行此匹配尝试在每个文件名嵌入代码(用换行仍然所附)@a

[email protected] 

是,那是隐蔽的。

+0

非常感谢您,尽管现在对我来说这有点隐晦。 你能解释一下这是如何工作的吗? –

+0

对于“非常新颖的正则表达式”的人来说,这不是一个好的答案,因为它为讨论引入了一种全新的语言;使用先进的,少用的正则表达式特征;把所有东西都挤在一起以节省几个字符;并没有提供任何解释。 – dan1111

+0

非常感谢你,现在你已经解释了它对我所需要的是完美的:-) –

3

你的grep命令一些修改:

grep -E 'nw=[[:digit:]]+\.a=[[:digit:]]+' 
  1. 使用“E”标志,所以你可以使用正则表达式的扩展,其中包括“ +'操作符。
  2. 使用双方括号
  3. 逃离期,否则会被用作操作者匹配任何字符
  4. 最后一个“+”从端缺失,未完全必要的,因为grep的将匹配更一般的情况,但它可能代表了更好的路径名
  5. 这可能是很好的做法,将(在这种情况下,单引号会做)

希望这有助于=)

+0

非常感谢! –

+1

单引号通常是最佳选择。如果必须将shell变量替换为正则表达式,请使用双引号,但要谨慎。 –

1

不要解析ls。使用find代替:

find . -maxdepth 1 -type d -regex '.*nw=[0-9]+\.a=[0-9]+.*' | while IFS= read -r dir 
do 
    echo "Found directory: $dir" 
    if [[ "$dir" =~ nw=([0-9]+)\.a=([0-9]+) ]] 
    then 
     echo "numbers are ${BASH_REMATCH[1]} and ${BASH_REMATCH[2]}" 
    fi 
done 
相关问题