извлечь несколько полей из строки - PullRequest
0 голосов
/ 09 апреля 2011

У меня есть строка

"name1:value1, ... name2:value2, ... name3:value3, ...",

я хочу извлечь значение1, значение2, значение3 в var1, var2, var3. Есть ли простое решение в Bash или Python? Чем проще, тем лучше.

Ответы [ 5 ]

3 голосов
/ 09 апреля 2011

Pure Bash:

declare string="name1:value1, name2:value2, name3:value3, name4:value4"

IFSsave=$IFS
IFS=','
declare -a array=( $string )                # split string into array
IFS=$IFSsave

for item in ${array[@]}; do
  item=${item/:/=}                          # substitute ':' to '='
  eval "${item/#name/var}"                  # substitute 'name' to 'var'
done

echo -e "the new variables : ${!var*}"

for v in ${!var*}; do
  echo -e "$v = ${!v}"                      # use indirect parameter expansion
done

Выход:

the new variables : var1 var2 var3 var4
var1 = value1
var2 = value2
var3 = value3
var4 = value4
3 голосов
/ 09 апреля 2011
>>> s = "name1:value1,name2:value2, name3:value3"
>>> d = dict(e.split(':') for e in s.split(','))
>>> for count, values in zip(range(1, len(d)+1), sorted(d.itervalues())):
...     globals()['var{0}'.format(count)] = values
... 
>>> var1
'value1'
>>> var2
'value2'
>>> var3
'value3'

Довольно хак, я знаю, но если есть более понятный способ, не стесняйтесь предлагать :-) (Примечание: это общее решение, и если вам нужны ключи словаря, вы можете использовать это с небольшим изменением)

РЕДАКТИРОВАТЬ: На основе комментария Томаса:

>>> s = "name1:value1,name2:value2, name3:value3"
>>> d = dict(e.split(':') for e in s.split(','))
>>> d
{'name2': 'value2', ' name3': 'value3', 'name1': 'value1'}
>>> d['name2']
value2
2 голосов
/ 09 апреля 2011
$ echo "name1:value1, name2:value2, name3:value3" | awk -F",[ \t]*" '{for(i=1;i<=NF;i++){split($i,a,":");print a[2] } }'
value1
value2
value3

$ echo "name1:value1, name2:value2, name3:value3" | ruby -e 'print gets.split(",").each{|x| puts x.split(":")[-1]}'
value1
value2
value3

Чтобы записать в переменную оболочки,

$ var=$(echo "name1:value1, name2:value2, name3:value3" | awk -F",[ \t]*" '{for(i=1;i<=NF;i++){split($i,a,":");print a[2] } }')
$ echo $var
value1 value2 value3
$ set -- $var
$ echo $1
value1
$ echo $2
value2

@ Тодд, пожалуйста, посмотрите ссылку на bash.

set [--abefhkmnptuvxBCEHPT] [-o option] [arg ...] .....
... Any arguments remaining after option processing are treated as values for the positional parameters and are assigned, in order,  to
          $1, $2, ...  $n..

--      If no arguments follow this option, then the positional parameters are unset.  Otherwise, the positional parameters are
                      set to the args, even if some of them begin with a -.
1 голос
/ 09 апреля 2011

когда у вас есть строка типа "name1:value1, ... name2:value2, ... name3:value3, ..." тогда вы можете сделать это, чтобы диктовать: d = eval('{'+"name1:value1, ... name2:value2, ... name3:value3, ..."+'}') а затем:

>>> print d['name1']
value1
...
0 голосов
/ 09 апреля 2011

Вот мое решение для bash.Я потратил много времени, чтобы убедиться, что это самое простое:

string="name1:value1,name2:value2,name3:value3"
varCount=0
for nameValuePair in $( tr , ' ' <<< $string )
do  
    IFS=:
    ((varCount++))
    set $nameValuePair
    eval var$varCount="$2"
done

# Do what you want with $var1, $var2, ... For example:
echo var3=$var3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...