【问题标题】:Setting another variable with a regular expression in KSH在 KSH 中使用正则表达式设置另一个变量
【发布时间】:2011-04-19 12:40:08
【问题描述】:

我有一个 Korn shell 脚本,我想根据另一个和一个正则表达式更改一个变量。

我想要发生的是生成一个如下所示的变量值,但不调用 sed:

$ echo 'orl,bdl,lap' | sed "s/,*orl//" | sed "s/^,*//"   
bdl,lap  
$ echo 'orl,bdl,lap' | sed "s/,*bdl//" | sed "s/^,*//"  
orl,lap  
$ echo 'orl,bdl,lap' | sed "s/,*lap//" | sed "s/^,*//"  
orl,bdl    

我已经尝试过

export b="orl,bdl,lap"  
export a=${b}*(,*lap)    

但通常会出错。这可能吗?

我看过这个:

if [[ $var = fo@(?4*67).c ]];then ...  

所以它应该像处理文件名一样工作。

【问题讨论】:

    标签: regex ksh


    【解决方案1】:

    是这样的吗?

    echo 'orl,bdl,lap' | cut -d"," -f3,2

    -f3,2 更改为您可能需要的其他字段。

    此外,如果您需要更好的正则表达式构造,您可以使用awk,但我需要您提供更好的细节来了解您需要什么转换。

    【讨论】:

    • 我通常会通过管道输出到 sed 或 awk,但我看到一个说明,说您可以在内部执行正则表达式并想学习它。
    【解决方案2】:

    一种方法是使用IFS

    var='orl,bdl,lap'
    saveIFS=$IFS
    IFS=','
    array=($var)
    newvar="${array[*]:1}"
    IFS=$saveIFS
    

    var='orl,bdl,lap'
    saveIFS=$IFS
    IFS=','
    set -- $var
    shift
    newvar="$*"
    IFS=$saveIFS
    

    或者使用正则匹配:

    var='orl,bdl,lap'
    pattern='^[^,]*,(.*)$'
    [[ $var =~ $pattern ]]
    newvar=${.sh.match[1]}
    

    【讨论】:

    • 酷 - 只是我需要的轻推。
    【解决方案3】:

    这是所问问题的实际答案:

    > print $KSH_VERSION
    Version AJM 93u+ 2012-08-01
    > b="orl,bdl,lap"
    > a=${b/~(E),*orl}
    > print $KSH_VERSION
    Version AJM 93u+ 2012-08-01
    >
    > b="orl,bdl,lap"
    >
    > a=${b/~(E),*orl} a=${a/~(E)^,*}
    > print $a
    bdl,lap
    >
    > a=${b/~(E),*bdl} a=${a/~(E)^,*}
    > print $a
    orl,lap
    >
    > a=${b/~(E),*lap} a=${a/~(E)^,*}
    > print $a
    orl,bdl
    > 
    

    请参阅the ksh93 manpage 了解详情:您必须将file name generation 下的模式和模式列表的材料与parameter expansion 下的搜索和替换变量扩展材料放在一起才能完全弄清楚。

    请注意,虽然您不能直接在变量扩展中连续应用多个正则表达式(就像您可以使用 sed,例如 sed "s/,*orl//;s/^,*//"),但您可以将两个变量赋值相同的语句,它们会从左到右依次执行。

    【讨论】:

      猜你喜欢
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多