2015-10-20 149 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

相關問題