如何列出名称中包含数字的文件并检索数字?

时间:2012-10-02 13:46:12

标签: regex bash grep

我是正则表达式的新手,因此我认为这是一个非常简单的问题,必须已经多次被问过,但不幸的是我找不到任何答案。

给定一个目录,我需要其所有子目录的列表,其名称遵循模式“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

为什么不起作用,我怎样才能检索数字?

提前谢谢你,         费迪南

3 个答案:

答案 0 :(得分:3)

对grep命令的一些更正:

grep -E 'nw=[[:digit:]]+\.a=[[:digit:]]+'
  1. 使用“-E”标志,以便您可以使用扩展的正则表达式,例如包含“+”运算符。
  2. 使用双方括号
  3. 退出句号,否则将用作匹配任何字符的运算符
  4. 最后一个'+'缺失,并非完全必要,因为grep会匹配更多一般情况,但它可能代表更好的路径名称
  5. 将正则表达式放在引号之间可能是一种好习惯(在这种情况下,单引号会这样做)
  6. 希望这有助于=)

答案 1 :(得分:2)

perl -e '@a=`ls`;m/nw=(\d+)\.a=(\d+)(?{print"$1\t$2\n"})/ for@a'

享受。

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

@a=`ls`;

寻找比赛

m/

nw =(我在$ 1中捕获的数字).a =(我在$ 2中捕获的数字)

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

从模式中开始评估代码

(?{

打印第一个号码,标签,第二个号码,换行符

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

结束匹配模式组

/

在数组@a

中对每个文件名(仍附加换行符)的嵌入代码执行此匹配尝试
for@a

是的,这很神秘。

答案 2 :(得分: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