我有一个字符串[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
我只返回了第一个值。
发布于 2019-02-06 13:41:34
通配符.*
将匹配最左边最长的字符串。如果您的意图是匹配单引号中的各个子字符串,请尝试
grep -o "'[^']*'" <<<"$ARR"
要删除值两边的单引号,只需通过管道连接到sed "s/'//g"
,并循环通过管道打印的行,执行以下操作
... commands ... |
while read -r id; do
: things with "$id"
done
发布于 2019-02-06 13:58:32
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
发布于 2019-02-06 15:13:26
这就是你要做的吗?
$ 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
https://stackoverflow.com/questions/54554881
复制相似问题