从文件名中有选择地提取数字

Seletively extract number from file name

我有一个文件列表,格式如下:AA13_11BBCC290_23DDEE92_34RR。我只需要提取 _ 字符之后的数字,而不是之前的数字。对于这三个文件名,我想得到 11、23、34 作为输出,并在每次提取后将数字存储到一个变量中。

我对 bash 和正则表达式还很陌生。目前,从 AA13_11BB,我可以得到 13_11:

for imgs in $DIR; do
LEVEL=$(echo $imgs | egrep -o [_0-9]+);
done

或两个单独的数字 13 和 11:

LEVEL=$(echo $imgs | egrep -o [0-9]+) 

请问如何获得我想要的输出?谢谢!

egrepsed 一起使用:

LEVEL=$(echo $imgs | egrep -o '_[0-9]+' | sed 's/_//' )

grep-P 标志一起使用

for imgs in $DIR
do 
    LEVEL=$(echo $imgs |  grep -Po '(?<=_)[0-9]{2}')
    echo $LEVEL
done

您可以使用正则表达式 .*_([0-9]+).* 在一个 sed 中完成(为 sed 正确转义):

sed "s/.*_\([0-9]\+\).*//" <<< "AA13_11BB"

它用第一个 captured group 替换行(() 内的子正则表达式),输出:

11

在您的脚本中:

LEVEL=$(sed "s/.*_\([0-9]\+\).*//" <<< $imgs) 

更新:@mklement0 所建议,在 BSD sedGNU sed 您可以使用 -E 参数缩短命令:

LEVEL=$(sed -E "s/.*_([0-9]+).*//" <<< $imgs)

为了补充现有的有用答案,使用 的核心:

以下单个命令中处理$DIR中的所有个文件名并且 将所有提取的标记读入 array:

IFS=$'\n' read -d '' -ra levels < \
  <(printf '%s\n' "$DIR"/* | egrep -o '_[0-9]+' | sed 's/_//')
  • IFS=$'\n' read -d '' -ra levels 将输入拆分为行并将它们存储为数组 ${levels[@]}.
  • 的元素
  • <(...) 是一个 process substitution,它允许命令的输出充当(临时的)输入文件。
  • printf '%s\n' "$DIR"/* 使用路径名扩展在其自己的行上输出每个文件名。
  • egrep -o '_[0-9]+' | sed 's/_//' 中的相同 - 它在 多个 输入行上同样有效,就像这里的情况一样。

要稍后处理提取的标记,请使用:

for level in "${levels[@]}"; do
  echo "$level" # work with $level
done