0

2 つの文字列の間で発生するすべてを印刷する方法を見つけようとしています。問題は、これらの文字列のペアが 1 行に複数回出現することです。したがって、ペアの各セット内の各フィールドを印刷できる必要があります。

api.txt複数の顧客とそれぞれのデバイス インベントリをリストしたファイルがあります。次のようになります。

Customer [customerId=12000, customerName=Acme, Inc.]
DeviceDetail [baseProductId=router-100, cardDetail=[CardDetail [baseCardId=router-100NIC1, cardDescription=Router 100 NIC, cardSerial=100NIC1], CardDetail [baseCardId=router-100NIC2, cardDescription=Router 100 NIC, cardSerial=100NIC2]], deviceSerial=100PRIMARY, deviceDescription=Router 100 Base Model]
DeviceDetail [baseProductId=router-2500, cardDetail=[CardDetail [baseCardId=router-2500NIC1, cardDescription=Router 2500 NIC, cardSerial=2500NIC1], CardDetail [baseCardId=router-2500NIC2, cardDescription=Router 2500 NIC, cardSerial=2500NIC2]], deviceSerial=2500PRIMARY, deviceDescription=Router 2500 Base Model]
Customer [customerId=24000, customerName=Anvil LLC]
DeviceDetail [baseProductId=router-5000, cardDetail=[CardDetail [baseCardId=router-5000NIC1, cardDescription=Router 5000 NIC, cardSerial=5000NIC1], CardDetail [baseCardId=router-500NIC2, cardDescription=Router 5000 NIC, cardSerial=5000NIC2]], deviceSerial=5000PRIMARY, deviceDescription=Router 5000 Base Model]
DeviceDetail [baseProductId=router-7500, cardDetail=null, deviceSerial=7500PRIMARY, DeviceDescription=Router 7500 Base Model, No NIC]

この出力は次のようになります。

"12000","Acme, Inc.","router-100","100PRIMARY","Router 100 Base Model","Router 100 NIC","100NIC1","Router 100 NIC","100NIC2"
"12000","Acme, Inc.","router-2500","2500Primary","Router 2500 Base Model","Router 2500 NIC","2500NIC1","Router 2500 NIC","2500NIC2"
"24000","Anvil LLC","router-5000","5000PRIMARY","Router 5000 Base Model,"Router 5000 NIC","5000NIC1","Router 5000 NIC","5000NIC2"

router-7500デバイスには子デバイスが接続されていないため( ) 、最後の DeviceDetail ( ) が省略されていることに注意してくださいcardDetail=null

awkフィールド区切り文字を設定し、それらの間にあるすべてのもの=を取得する方法を理解して,います (つまり、各フィールド値は等号とコンマの間にあります)。ただし、複数の場合に探している結果を取得する方法がわかりませんデータのインスタンスは、CardDetail各行に不明な回数表示されるか、まったく表示されない場合もあります。

考慮すべきことは、 の各インスタンスがと閉じ括弧 ( ) のCard Detail間にキャプチャされることです。これにより、各行の の各インスタンスをキャプチャするのに役立つ可能性がありますが、確かではありません。Card Detail]Card Detail

私も結婚していませんawksedまたはその他の解析プログラムを使用しても同様に機能します。基本的に、何が一番うまくいくか。

提供されたヘルプに事前に感謝します!

4

1 に答える 1

2

処理が awk/sed で行うには厄介すぎる場合は、perl、ruby、または python などのより「最新の」スクリプト言語を使用するときです。このようなものから始める必要があります (perl):

#!/usr/bin/env perl
use strict;
use warnings;

my $customerName;
my $customerId;
while (my $line = <DATA>) {
    if ($line =~ m{
            customerId=(?<customerId>.*?), 
            \ customerName=(?<customerName>.*)\]
        }x)
    {
            $customerId = $+{customerId};
            $customerName = $+{customerName};
    } elsif ($line =~ m{
                    baseProductId=(?<baseProductId>.*?),
                    \ cardDetail=\[.*baseCardId=(?<baseCardId>.*?),
                    \ cardDescription=(?<cardDescription>.*?),
                    .*deviceSerial=(?<deviceSerial>.*?),
                    \ deviceDescription=(?<deviceDescription>.*)\]
              }x)
    {
            my ($productId, $cardId) = ($1, $2);
            print '"'
            . join('","',
                    $customerId,
                    $customerName,
                    $+{baseProductId},
                    $+{baseCardId},
                    $+{deviceSerial},
                    $+{deviceDescription},
                    $+{cardDescription},
               )
            . "\"\n" ;
    }
}

__DATA__
Customer [customerId=12000, customerName=Acme, Inc.]
DeviceDetail [baseProductId=router-100, cardDetail=[CardDetail [baseCardId=router-100NIC1, cardDescription=Router 100 NIC, cardSerial=100NIC1], CardDetail [baseCardId=router-100NIC2, cardDescription=Router 100 NIC, cardSerial=100NIC2]], deviceSerial=100PRIMARY, deviceDescription=Router 100 Base Model]
DeviceDetail [baseProductId=router-2500, cardDetail=[CardDetail [baseCardId=router-2500NIC1, cardDescription=Router 2500 NIC, cardSerial=2500NIC1], CardDetail [baseCardId=router-2500NIC2, cardDescription=Router 2500 NIC, cardSerial=2500NIC2]], deviceSerial=2500PRIMARY, deviceDescription=Router 2500 Base Model]
Customer [customerId=24000, customerName=Anvil LLC]
DeviceDetail [baseProductId=router-5000, cardDetail=[CardDetail [baseCardId=router-5000NIC1, cardDescription=Router 5000 NIC, cardSerial=5000NIC1], CardDetail [baseCardId=router-500NIC2, cardDescription=Router 5000 NIC, cardSerial=5000NIC2]], deviceSerial=5000PRIMARY, deviceDescription=Router 5000 Base Model]
DeviceDetail [baseProductId=router-7500, cardDetail=null, deviceSerial=7500PRIMARY, DeviceDescription=Router 7500 Base Model, No NIC]

(修飾子を検索して、一致演算子のxオプションを検索できます。また、同じ perldoc で呪文のキャプチャ グループを検索します。m{}perldoc perlre/xnamed$+{foo}

于 2013-01-21T14:46:40.227 に答える