Установка другой переменной с регулярным выражением в KSH

У меня есть сценарий оболочки Korn, в котором я хотел бы изменить переменную на основе другой и регулярного выражения.

Что я хочу сделать, так это сгенерировать значение переменной, как показано ниже, но без вызова 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 ...  

поэтому он должен работать так же, как и с именами файлов.


person jim    schedule 30.09.2010    source источник


Ответы (3)


Это что-то вроде этого?

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

Измените -f3,2 на другие поля, которые могут вам понадобиться.

Кроме того, если вам нужна лучшая конструкция регулярного выражения, вы можете использовать awk, но тогда мне нужно, чтобы вы предоставили более подробную информацию, чтобы понять, какое преобразование вам нужно.

person jyz    schedule 30.09.2010
comment
Обычно я обращался к sed или awk, но наткнулся на заметку, в которой говорилось, что регулярное выражение можно выполнять внутри, и я хотел его изучить. - person jim; 30.09.2010

Один из способов сделать это — использовать IFS:

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

or

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

Или используя сопоставление регулярных выражений:

var='orl,bdl,lap'
pattern='^[^,]*,(.*)$'
[[ $var =~ $pattern ]]
newvar=${.sh.match[1]}
person Dennis Williamson    schedule 30.09.2010
comment
Круто - как раз то, что мне нужно. - person jim; 30.09.2010

вот фактический ответ на заданный вопрос:

> 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
> 

подробности см. на справочной странице ksh93: вы должны поставить вместе материал по шаблонам и спискам шаблонов в разделе генерация имени файла с материалом по расширению переменных поиска и замены в разделе расширение параметра, чтобы понять это полностью.

обратите внимание, что, хотя вы не можете напрямую применять несколько регулярных выражений подряд в расширении переменной (как вы могли бы сделать с sed, например, sed "s/,*orl//;s/^,*//"), вы можете поместить два назначения переменных в один и тот же оператор, и они буду выполнять последовательно, слева направо.

person Aaron Davies    schedule 25.03.2014