使用sed从文件中的匹配行中提取几个匹配的字符串

时间:2015-10-20 09:42:30

标签: regex shell sed

我有一个类似于此字符串的文件:

abcd u'current_count': u'2', u'total_count': u'3', u'order_id': u'90'

我必须为每行文件找到current_count和total_count。我正在尝试下面的命令,但它没有工作。请帮忙。

grep current_count file | sed "s/.*\('current_count': u'\d+'\).*/\1/"

输出整行,但我想要这样的东西:

'current_count': u'3', 'total_count': u'3'

2 个答案:

答案 0 :(得分:1)

它打印整行,因为s命令中的模式不匹配,因此不会发生替换。

sed正则表达式不支持\d数字,x+支持xx*。 GNU sed有一个-r选项可以启用扩展正则表达式支持,因此+将是一个元字符,但\d仍然无法正常工作。 GNU sed还允许\+作为基本正则表达式模式中的元字符,但这不是POSIX标准。

无论如何,这将有效:

echo -e "foo\nabcd u'current_count': u'2', u'total_count': u'3', u'order_id': u'90'" |
sed -nr "s/.*('current_count': u'[0-9]+').*/\1/p"
# output:  'current_count': u'2'

请注意,我使用sed -n s///p跳过grep。我也可以使用/current_count/作为地址:

sed  -r -e '/current_count/!d' -e "s/.*('current_count': u'[0-9]+').*/\1/"

或者只使用grep打印模式的匹配部分,而不是整行:

grep -E -o "'current_count': u'[[:digit:]]+'

(或egrep而不是grep -E)。我忘记了grep -o是否是POSIX要求的行为。

答案 1 :(得分:0)

对我来说,这看起来像某种序列化的Python数据。基本上我会尝试找出数据的来源并正确解析它。

然而,虽然是hackish,sed也可以在这里使用:

sed "s/.*current_count': [a-z]'\([0-9]\+\).*/\1/" input.txt
sed "s/.*total_count': [a-z]'\([0-9]\+\).*/\1/" input.txt