2015-10-20 117 views
-1

我有类似这样的字符串文件:提取几个字符串匹配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' 

回答

1

它打印整个线,因为在s命令的模式不匹配,所以没有替代发生。

sed regexes不支持\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所需的行为。

+0

谢谢。这有效,但为什么你在sed命令的末尾使用了'p'。 – Anuj

+0

@Anuj:'sed -n'默认不会打印出行。只有在成功替换之后,/// p'才会打印模式空间。因此,它使用's/pattern /'来过滤行,执行'grep'之前的工作,或者'/ current_count /!d'(删除不匹配的行)正在执行。这一切都在'sed'手册页中。 –

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 
+0

是的,这是一个Python API请求数据。例如,我刚刚列出了部分行。我尝试了与你的答案中提到的相同的字符串,但它不起作用。它看起来应该工作,但不适合我。 – Anuj