首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BASH_REMATCH来匹配任何正则表达式并提供输出。

BASH_REMATCH来匹配任何正则表达式并提供输出。
EN

Stack Overflow用户
提问于 2017-04-28 20:18:47
回答 1查看 301关注 0票数 0

我试图将输入字符串与regex模式匹配,如下所示:

代码语言:javascript
复制
formatDate(){
 d='[[:digit:]]'
 pattern_a="($d$d$d$d)($d$d)($d$d) ($d$d)($d$d)($d$d)"
 pattern_b="($d$d$d$d)($d$d)($d$d)_($d$d)($d$d)($d$d)"
 pattern_c="($d$d$d$d)($d$d)($d$d):($d$d)($d$d)($d$d)"
 pattern_d="($d$d$d$d)($d$d)($d$d)($d$d)($d$d)($d$d)"
 pattern_e="($d$d$d$d)($d$d)($d$d)($d$d)($d$d)($d$d)($d$d$d)"

 unparsable_date="Unable to parse date!"
 TM="TM"

appName="$1"
actionType="$2"
position="$3"
timestamp="$4"

shopt -s nocasematch
    case "$position" in
       "YYYYMMDD HHMMSS"|"YYYYMMDD_HHMMSS"|"YYYYMMDD:HHMMSS"|"YYYYMMDDHHMMSS"|"YYYYMMDDHHMMSSSSS")
            if [[ $timestamp =~ $pattern_a|$pattern_b|$pattern_c|$pattern_d|$pattern_e ]]; then
               formattedDate=${BASH_REMATCH[1]}${BASH_REMATCH[2]}${BASH_REMATCH[3]}
               formattedTime=${BASH_REMATCH[4]}${BASH_REMATCH[5]}${BASH_REMATCH[6]}
               formattedTimeStamp="$appName$actionType$formattedDate $appName$actionType$TM$formattedTime"
           else
               formattedTimeStamp=$unparsable_date
            fi
       ;;
    esac

 }

如果我的输入与$pattern_a匹配,那么正确填充formattedTimeStamp的值如下所示:

输入- formatDate "appName" "actionType" "YYYYMMDD HHMMSS" "20170426 102300"

输出- appNameactionType20170426 appNameactionTypeTM102300

在与pattern_a以外的任何其他模式匹配的所有其他场景中,代码都不会产生正确的输出,

代码语言:javascript
复制
 appNameactionType appNameactionTypeTM 
"date and time is missing here "

任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-28 20:40:45

现在,我用for循环.It代替了case语句。

代码语言:javascript
复制
#!/bin/bash
d='[[:digit:]]'
 pattern_a="($d$d$d$d)($d$d)($d$d) ($d$d)($d$d)($d$d)"
 pattern_b="($d$d$d$d)($d$d)($d$d)_($d$d)($d$d)($d$d)"
 pattern_c="($d$d$d$d)($d$d)($d$d):($d$d)($d$d)($d$d)"
 pattern_d="($d$d$d$d)($d$d)($d$d)($d$d)($d$d)($d$d)"
 pattern_e="($d$d$d$d)($d$d)($d$d)($d$d)($d$d)($d$d)($d$d$d)"
 unparsable_date="Unable to parse date!"

 TM="TM"

appName="appName"
actionType="actionType"
position="YYYYMMDD_HHMMSS"
timestamp="20170426_102300"
declare -a arr=( "$pattern_a" "$pattern_b" "$pattern_c" "$pattern_d" "$pattern_e")

for i in "${arr[@]}"
do
   if [[ $timestamp =~ $i ]]; then
    formattedDate=${BASH_REMATCH[1]}${BASH_REMATCH[2]}${BASH_REMATCH[3]}
    formattedTime=${BASH_REMATCH[4]}${BASH_REMATCH[5]}${BASH_REMATCH[6]}
    formattedTimeStamp="$appName$actionType$formattedDate $appName$actionType$TM$formattedTime"
    echo $formattedTimeStamp
    fi
done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43688294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档