在KSH中使用正则表达式设置另一个变量

时间:2010-09-30 18:48:15

标签: regex ksh

我有一个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 ...  

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

3 个答案:

答案 0 :(得分:1)

是这样的吗?

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

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

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

答案 1 :(得分:0)

执行此操作的一种方法是使用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]}

答案 2 :(得分:0)

这里是问题的实际答案:

> 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/^,*//"),但可以将两个变量赋值放在同一个语句中,它们将从左到右连续执行。