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

为什么它不起作用,我如何检索数字?

提前谢谢你,费迪南多

4

3 回答 3

3

对 grep 命令的一些更正:

grep -E 'nw=[[:digit:]]+\.a=[[:digit:]]+'
  1. 使用“-E”标志,以便您可以使用扩展的正则表达式,例如,其中包括“+”运算符。
  2. 使用双方括号
  3. 转义句点,否则将用作匹配任何字符的运算符
  4. 最后缺少一个“+”,这不是完全必要的,因为 grep 将匹配更一般的情况,但它可能更好地代表您的路径名
  5. 将正则表达式放在引号之间可能是一种好习惯(在这种情况下,单引号就可以了)

希望这会有所帮助=)

于 2012-10-02T13:53:49.537 回答
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

是的,那很神秘。

于 2012-10-02T14:03:45.810 回答
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
于 2012-10-02T16:15:12.363 回答