我是正则表达式的新手,因此我认为这是一个非常简单的问题,必须已经多次被问过,但不幸的是我找不到任何答案。
给定一个目录,我需要其所有子目录的列表,其名称遵循模式“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
为什么不起作用,我怎样才能检索数字?
提前谢谢你, 费迪南
答案 0 :(得分:3)
对grep命令的一些更正:
grep -E 'nw=[[:digit:]]+\.a=[[:digit:]]+'
希望这有助于=)
答案 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