如果我有:
(1, 'username', '9787b9f43503ef4a5264865a97beb826', 'VdJt1S6R', 'z7WHG1tHg9cDWY9VWKawOu2b2KKyPkQji7oXghdhL68ZIqrTzn')
如何获得格式:
9787b9f43503ef4a5264865a97beb826:VdJt1S6R
我需要使用grep来执行此操作,并且将有多个数据库条目。
答案 0 :(得分:0)
您可以使用GNU grep从输入中获取需求信息,但很难将其重新组织为9787b9f43503ef4a5264865a97beb826:VdJt1S6R
grep -Po "(?<=username',).*(?='[^']*')" file
'9787b9f43503ef4a5264865a97beb826', 'VdJt1S6R',
使用其他工具,例如awk/sed
,它可以生成您期望的格式,但似乎只修复了grep命令。
答案 1 :(得分:0)
单独使用grep
这会非常麻烦。我可能会选择awk:
awk -F "'" '{printf "%s:%s\n", $4, $6}'
这是使用'
作为字段分隔符,因此对输入数据做出强有力的假设。
$ echo "(1, 'username', '9787b9f43503ef4a5264865a97beb826', 'VdJt1S6R', 'z7WHG1tHg9cDWY9VWKawOu2b2KKyPkQji7oXghdhL68ZIqrTzn')" | awk -F "'" '{printf "%s:%s\n", $4, $6}'
9787b9f43503ef4a5264865a97beb826:VdJt1S6R
$
或者,您可以考虑使用纯bash语句,因为您拥有有限的工具集。类似的东西:
while IFS=", " read -a A; do echo "${A[2]//\'}:${A[3]//\'}"; done
这将从stdin一个接一个地读取数组A
,并在,
上分开。对于每一行,它以您想要的格式回显所需的字段,删除'
个字符:
$ echo "(1, 'username', '9787b9f43503ef4a5264865a97beb826', 'VdJt1S6R', 'z7WHG1tHg9cDWY9VWKawOu2b2KKyPkQji7oXghdhL68ZIqrTzn')" | \
> while IFS=", " read -a A; do echo "${A[2]//\'}:${A[3]//\'}"; done
9787b9f43503ef4a5264865a97beb826:VdJt1S6R
$
如果您必须使用grep
,那么您可能也需要其他工具。例如,您可以使用grep
提取所需信息,然后使用tr
对其进行格式化:
$ echo "(1, 'username', '9787b9f43503ef4a5264865a97beb826', 'VdJt1S6R', 'z7WHG1tHg9cDWY9VWKawOu2b2KKyPkQji7oXghdhL68ZIqrTzn')" | \
> grep -oE "[[:xdigit:]]{32}', '[^']{8}" | \
> tr -s ", '" :
9787b9f43503ef4a5264865a97beb826:VdJt1S6R
$
答案 2 :(得分:0)
要建议稍微不同的方法,以下内容会将您古怪的输入重新格式化为冒号分隔;
sed "s/^(//;s/'*, '*/:/g;s/')$//" wackyfile
为了便于携带,我添加了'*
而不是更正确的'\?
,因为有些sed
方言不支持,而其他一些方法则要求您省略反斜杠。 *
量词在任何地方都是一样的。如果您的sed
支持-r
选项,则可能需要使用该选项,并相应地调整正则表达式。
现在,您可以通过管道cut -d: -f3-4
获取所需的两个字段。
答案 3 :(得分:0)
这应该做:
awk -F\' '{print $4":"$6}' file
9787b9f43503ef4a5264865a97beb826:VdJt1S6R