我有一个类似于此字符串的文件:
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'
答案 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