【问题标题】:REGEX filename Shellscript check正则表达式文件名 Shellscript 检查
【发布时间】:2017-09-12 16:16:41
【问题描述】:

我正在尝试使用正则表达式编写一个 bashscript 检查来区分以下文件。我试图在 if 语句中选择 DRLIC_INFO_20170912.out 而不是 DRLIC_INFO_20170912_TEMP.out。 20170912 将是每日时间戳。

输入文件名:

DRLIC_INFO_2017-09-12.out
DRLIC_INFO_2017-09-12_TEMP.out

当前检查:

SEARCH_DRLIC_INFO='DRLIC_INFO'

if [[ $filename == *$SEARCH_DRLIC_INFO* ]]

【问题讨论】:

  • 试试if [[ $filename == *$SEARCH_DRLIC_INFO\.* ]]
  • 您好,我添加了更新以使我的问题更加清晰。试图选择第一个文件而不是第二个。
  • @Defcon,请看看我的回答,如果这对你有帮助,请告诉我,

标签: regex linux bash shell unix


【解决方案1】:

您能否尝试关注一下,如果这对您有帮助,请告诉我。

filename1="DRLIC_INFO_20170912_TEMP.out"
regex="DRLIC_INFO_[[:digit:]]+_TEMP.out"
if [[ $filename1 =~ $regex ]]; then echo "File named "$filename1 " found."; else echo "File name " $filename1 " not found."; fi

或者,如果您想具体说明字符串中应包含 8 位数字的日期,您也可以将上面的正则表达式变量更改为以下。

regex="DRLIC_INFO_[[:digit:]]{8}_TEMP.out

编辑:如果您想使用如您所显示的 SEARCH_DRLIC_INFO 变量,您可以尝试关注然后让我知道。

SEARCH_DRLIC_INFO="DRLIC_INFO"
filename1=$SEARCH_DRLIC_INFO"_20170912_TEMP.out"
regex="DRLIC_INFO_[[:digit:]]{8}_TEMP.out"
if [[ $filename1 =~ $regex ]]; then echo "File named "$filename1 " found."; else echo "File name " $filename1 " not found."; fi

【讨论】:

    【解决方案2】:

    我认为您根本不需要正则表达式。如果您知道文件的确切格式,那么您可以制作一个与之匹配的 glob 模式。通过在末尾指定部分,可以防止包含_TEMP 的文件匹配:

    timestamp=20170912
    for file in DRLIC_INFO_"$timestamp".out; do
        echo "$file" # for debugging
        # :
    done
    

    该循环仅表明您想要匹配的文件 - 如果您愿意,您可以将正文替换为 :(什么都不做,返回成功)。在循环之后,$file 包含您的文件名。

    或者,您可以使用数组:

    files=( DRLIC_INFO_"$timestamp".out )
    echo "${files[0]}"
    

    在这种情况下,第 0 个元素是您的文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多