2014-10-08 46 views
0

輸入文件:獲取變量使用內部和/或元組外SED或Perl

{custom:{ver:120,name:hello,form:123},name:world,browser:ie} 
{custom:{ver:130,name:test,form:123},browser:ie} 

sed命令:

sed 's/^.*name:\([^,]*\).*$/\1/' input.txt 

輸出:

world 
test 

如何區分元組內的變量和元組外部的變量?

預期輸出的namecustom值:

內自定義名稱

sed命令

hello 
test 
以外的自定義名稱

sed命令:

world 
blank or {custom:{ver:130,name:test,form:123},browser:ie} 

注:name可以隨時隨地出現文件 - 開始,中間或結束 - 或可以不存在。

perl也會爲我工作。 謝謝。

回答

1

定製內部名稱使用,而單純的正則表達式:

perl -lne 'print /custom:\{[^{}]*name:([^,}]*)/ ? $1 : ""' input.txt 

輸出:

hello 
test 

名稱自定義外:

perl -lne 'print /custom:\{[^{}]*\}(*SKIP)(*FAIL)|name:([^,}]*)/ ? $1 : ""' input.txt 

輸出:

world 

開關

  • -l:啓用行結束處理
  • -n:創建一個while(<>){...}循環在你的輸入文件中的每一行「 」。
  • -e:通知perl在命令行上執行代碼。
+0

他們的工作很好,當線路上有名字,當存在,它只是刪除行的行沒有名字。在第二個命令輸出中,第二行中應該有空行,因爲輸入中沒有名稱 – user2711819 2014-10-08 22:02:02

+0

然後使用條件運算符而不是if。 – Miller 2014-10-08 22:03:45

2

如果將它視爲JSON,閱讀和維護就簡單多了。

use JSON qw(decode_json); 
while (<>) { 
    s/(\w+)/"$1"/g; 
    my $data = decode_json($_); 
    print($data->{name}, "\n") if $data->{name}; 
} 

作爲一個班輪:

#Any version 
perl -MJSON -nle' 
    s/(\w+)/"$1"/g; 
    my $data = decode_json($_); 
    print $data->{name} if $data->{name}; 
' 

#5.10+ 
perl -MJSON -nE' 
    s/(\w+)/"$1"/g; 
    my $data = decode_json($_); 
    say $data->{name} if $data->{name}; 
' 

#5.14+ 
perl -MJSON -nE' 
    my $data = decode_json(s/(\w+)/"$1"/gr); 
    say $data->{name} if $data->{name}; 
' 

#5.14+ 
perl -MJSON -nE'say for grep $_, decode_json(s/(\w+)/"$1"/gr)->{name}' 
+0

感謝這也買了很慢,它看起來我需要安裝json :: XS模塊來加速解析。花了1小時解析25 MB文件中的55列。 – user2711819 2014-10-14 17:46:39

+0

我追求可靠性和靈活性,而無需在開發時花費太多。是的,它沒有解決方案的速度。是的,如果您尚未安裝JSON :: XS,那麼安裝JSON :: XS會大大加快速度。 – ikegami 2014-10-14 17:50:47

+0

與安裝JSON :: XS模塊,性能將相當於hakish解決方案嗎? (用解決方案,25分鐘的文件在一兩分鐘內解析)。如果性能幾乎相等,我需要推薦我的公司安裝。謝謝 !! – user2711819 2014-10-15 15:37:41