簡體   English   中英

使用 sed 從文件中的匹配行中提取幾個匹配的字符串

[英]Extract few matching strings from matching lines in file using 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'

它正在打印整行,因為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 -ns///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 要求的行為。

對我來說,這看起來像是某種序列化的 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM