regex - 如何在 linux shell 脚本中使用正则表达式检查文件名

标签 regex linux shell

让我知道合适的正则表达式来检查 linux shell 脚本中的以下文件名。

VMHOST_YYYYMMDD_CPU.csv
VMHOST_YYYYMMDD_MEM.csv
VMHOST_YYYYMMDD_DISK.csv
VMHOST_YYYYMMDD_NET.csv
VMOS_YYYYMMDD_CPU.csv
VMOS_YYYYMMDD_MEM.csv
VMOS_YYYYMMDD_DISK.csv
VMOS_YYYYMMDD_NET.csv

我试过这样的:

if [[ $filename == [VMHOST|VMOS][_][0-9]{8}[_][CPU|MEM|DISK|NET][.]csv ]]; then
        echo "$filename"
fi

但它不起作用。 那么任何人都可以帮助我解决这个问题。

最佳答案

使用扩展模式匹配:

shopt -s extglob  ## Required if Bash is earlier than 4.1.
[[ $filename == @(VMHOST|VMOS)_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_@(CPU|MEM|DISK|NET).csv ]] || echo "== $filename failed."

或者简单地使用正则表达式:

[[ $filename =~ (VMHOST|VMOS)_[0-9]{8}_(CPU|MEM|DISK|NET)[.]csv ]]

如果 Bash 早于 4.0,你需要把它存储在一个变量上:

re='(VMHOST|VMOS)_[0-9]{8}_(CPU|MEM|DISK|NET)[.]csv'
[[ $filename =~ $re ]]

通过扩展模式匹配,您可以跳过测试,只扩展您只需要的文件:

shopt -s extglob
for filename in @(VMHOST|VMOS)_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_@(CPU|MEM|DISK|NET).csv; do
    echo "$filename"
done

测试:

#!/bin/bash

names=(VMHOST_00000000_CPU.csv VMHOST_00000000_MEM.csv VMHOST_00000000_DISK.csv VMHOST_00000000_NET.csv VMOS_00000000_CPU.csv VMOS_00000000_MEM.csv VMOS_00000000_DISK.csv VMOS_00000000_NET.csv)

re='(VMHOST|VMOS)_[0-9]{8}_(CPU|MEM|DISK|NET)[.]csv'
for filename in "${names[@]}"; do
    [[ $filename == @(VMHOST|VMOS)_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_@(CPU|MEM|DISK|NET).csv ]] && echo "$filename (extglob ok)"
    [[ $filename =~ $re ]] && echo "$filename (regex ok)"
    echo
done

输出:

VMHOST_00000000_CPU.csv (extglob ok)
VMHOST_00000000_CPU.csv (regex ok)

VMHOST_00000000_MEM.csv (extglob ok)
VMHOST_00000000_MEM.csv (regex ok)

VMHOST_00000000_DISK.csv (extglob ok)
VMHOST_00000000_DISK.csv (regex ok)

VMHOST_00000000_NET.csv (extglob ok)
VMHOST_00000000_NET.csv (regex ok)

VMOS_00000000_CPU.csv (extglob ok)
VMOS_00000000_CPU.csv (regex ok)

VMOS_00000000_MEM.csv (extglob ok)
VMOS_00000000_MEM.csv (regex ok)

VMOS_00000000_DISK.csv (extglob ok)
VMOS_00000000_DISK.csv (regex ok)

VMOS_00000000_NET.csv (extglob ok)
VMOS_00000000_NET.csv (regex ok)

关于regex - 如何在 linux shell 脚本中使用正则表达式检查文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24902667/

相关文章:

javascript - 正则表达式只返回第一场比赛?

regex - htaccess重定向,不带路径

regex - PHP中[\w\-]正则表达式是什么意思

linux - 如何从 Linux 中的 http 链接获取文件名?

c# - Xamarin.Forms Shell GoToAsync 在 iOS 中无法按预期工作

java - 我怎样才能把它变成 Java 正则表达式?

c++ - 如何访问 qt 上的父窗口小部件?

c++ - 在 linux 上编译 windows 64 程序时出现问题 - headers

Java expectj通过跳转框执行linux命令

BASH 同时将大写字母转换为小写字母,反之亦然