良い午後です!
複数のクラスに対してクエリを実行し、特定の属性が欠落しているクラスのみを返したいと思います。
たとえば、私が作業しているプログラムにCar
オブジェクトがあるクラス(この場合は車)があるとしますTyres
。そのオブジェクトはTyres
1 つ以上のプロパティを持つことができます。
Brand 1
Brand 2
Brand 3
私が望むのは、クエリを実行して次のクラスを返すことです。
ブランドなし1
私が経験している問題は、このクエリを実行して結果をgrepするときに上記の要件を満たすクラスを返すのではなく、すべてのクラスを返し、単にブランド1を無視するように見えることです。
たとえば、クラスにこのパラメータの目的でCar_1
3つの属性を持つオブジェクトがある場合 - ブランド3を持たないクラスのみを表示したいと思います。代わりに、Grepはブランド3を省略したクラスを返すようです。Tyres
Brand 1 Brand 2 Brand 3
私が望むことを達成するための最善の解決策は何ですか?
明白なあいまいさについて事前にお詫び申し上げます。私は私が使用しているプログラムについて中立を維持し、正しい方法で結果を特定することに集中しようとしています。
乾杯!
答え1
次のようにしてみてください。
moquery ..... |
sed -e 's/^#/\n#/' |
perl -00 -ne 'print unless /^Tyres\h*:.*\bBrand 1\b/mig'
スクリプトsed
は各前に改行文字を挿入します#
。これはperl
(または)awk
の「短絡モード」で処理するのに適しています。 「段落」は、テキスト間に少なくとも1行の空白行がある1つ以上のテキスト行です。
つまり、sed
変換します(rednectar.netブログ投稿から取得したサンプルデータ)。moquery – CiscoのMysterious Obscure ACIクエリユーティリティ):
# fv.Tenant
name : Tenant5
dn : uni/tn-Tenant5
uid : 15374
# fv.Tenant
name : common
dn : uni/tn-common
uid : 0
# fv.Tenant
name : Tenant3
dn : uni/tn-Tenant3
uid : 15374
これに関して:
# fv.Tenant
name : Tenant5
dn : uni/tn-Tenant5
uid : 15374
# fv.Tenant
name : common
dn : uni/tn-common
uid : 0
# fv.Tenant
name : Tenant3
dn : uni/tn-Tenant3
uid : 15374
これにより、Perlスクリプトは「Brand 1」を含むTiresエントリを除くすべてのレコードを印刷します。正規表現は大文字と小文字を区別せず、\b
「ブランド1」の周りに単語の境界マークを使用するため、部分一致(例:「オフブランド1」または「ブランド100」)は実行されません。
レコードに対して追加の処理(たとえば、他のフィールドの一致、一部のデータ抽出、および関連タスクの実行)を実行する必要がある場合は、次のことができます。
moquery ..... |
sed -e 's/^#/\n#/' |
perl -00 -ne '
next if /^Tyres\h*:.*\bBrand 1\b/mig;
...more perl statements here...;
print'
または、.NET Frameworkを使用する代わりにスタンドアロンPerlスクリプトを作成することもできます-n
。
また見なさい:ACI オブジェクト moquery チートシート シスコのコミュニティウェブサイト。