Установка другой переменной с регулярным выражением в KSH - PullRequest
2 голосов
/ 30 сентября 2010

У меня есть сценарий оболочки 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 ...  

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

Ответы [ 3 ]

1 голос
/ 30 сентября 2010

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

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

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

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

0 голосов
/ 25 марта 2014

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

> 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/^,*//"), вы можете поместить два назначения переменных в одном выражении, и они будут выполняться последовательно, слева отправый.

0 голосов
/ 30 сентября 2010

Один из способов сделать это - использовать 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]}
...