如何解析sed命令的每个匹配项

时间:2019-02-06 13:33:55

标签: regex bash shell sed

我有一个字符串[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 :(得分:1)

通配符.*将匹配最长的最可能的字符串。如果您打算匹配单引号中的各个子字符串,请尝试

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

要删除值周围的单引号,只需将其引至sed "s/'//g"并遍历由管道打印的行,请执行

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

这是您要做什么吗?

$ 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