Как разобрать каждый матч команды sed - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть строка [u'SOMEVALUE1', u'SOMEVALUE2', u'SOMEVALUE3'], я хотел бы проанализировать каждый элемент, соответствующий моей команде sed.Соответствующие элементы находятся в одинарных кавычках.Вот мой сценарий

#!/bin/bash
ARR="[u'SOMEVALUE1', u'SOMEVALUE1', u'SOMEVALUE1']"
for id in $(sed -n "s/^.*'\(.*\)'.*$/\1/ p" <<< ${ARR});
do
    echo "$id"
done

У меня есть только первое возвращенное значение.

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

BASH может сопоставлять регулярные выражения с помощью =~ (см. man bash ).Совпадение более одного раза немного болезненно, но в вашем случае мы можем разделить ввод на пустое пространство и сопоставить один раз для каждого элемента:

ARR="[u'SOMEVALUE1', u'SOMEVALUE1', u'SOMEVALUE1']"
for A in $ARR
do
    [[ $A =~ u\'(.+)\' ]] && echo ${BASH_REMATCH[1]}
done

приводит к

SOMEVALUE1
SOMEVALUE1
SOMEVALUE1
0 голосов
/ 06 февраля 2019

это то, что вы пытаетесь сделать?

$ ARR="[u'SOMEVALUE1', u'SOMEVALUE1', u'SOMEVALUE1']"

$ awk -v RS="'" '!(NR%2)' <<< "$ARR"
SOMEVALUE1
SOMEVALUE1
SOMEVALUE1

$ awk -v RS="'" '!(NR%2)' <<< "$ARR" |
while IFS= read -r id; do echo "id=$id"; done
id=SOMEVALUE1
id=SOMEVALUE1
id=SOMEVALUE1
0 голосов
/ 06 февраля 2019

Подстановочный знак .* будет соответствовать самой длинной левой строке.Если вы хотите сопоставить отдельные подстроки, заключенные в одинарные кавычки, попробуйте

grep -o "'[^']*'" <<<"$ARR"

. Чтобы убрать одинарные кавычки вокруг значений, просто направьте трубку к sed "s/'//g" и зациклите строки, напечатанные в трубе., сделай

... commands ... |
while read -r id; do
    : things with "$id"
done
...