私は多くの.appファイルから私のサーバーを検索し、2つの文字列の間にある内容を出力するスクリプトを作成しようとしています。 2つの文字列の間に発生した内容のみを出力します。 AWKとGREPを使用してこれを実行できますが、検索する必要がある用語にエスケープ文字が含まれているため、機能しません。
以下は.datファイルから抜粋したものです。
<List Variable name="lookups">
<Value>
<Value name="lookups" value="LSM_OPT"/>
<OTHER GARBAGE... >
<Value name="lookup_name" value="123_Done"/>
<OTHER GARBAGE... >
<Value name="lookup_name" value="XYZ_DONE"/>
<OTHER GARBAGE... >
</Variable>
<List Variable name="lookups_for_data">
<Value>
<Value name="lookups" value="LSM_OPT"/>
</Variable>
'List Variable name="lookups"' と '/Variable' の間のすべてのデータを探す必要があり、他にはありません... 問題の一部はエスケープ文字ですが、.dat ファイルに他の項目もあります。キャプチャしたくありませんが、元の検索値や上記の「リスト変数名= "lookups_for_data""などの追加データが含まれています。そんなことはしたくありません。
私はいくつかのawkとsedオプションを試しましたが、問題はエスケープ文字だと思います。どんな助けでも大変感謝します!ご協力ありがとうございます! !
答え1
聞くだけで、ファイル内の次の2つのトークン文字列の間に現れるすべてのエントリを見つけたいと思います。
<List Variable name="lookups">
...
...
</Variable>
これを行うには、次のsed
コマンドを使用できます。
$ sed '/<List Variable name="lookups">/,/<\/Variable>/!d;//d' file.dat
<Value>
<Value name="lookups" value="LSM_OPT"/>
<OTHER GARBAGE... >
<Value name="lookup_name" value="123_Done"/>
<OTHER GARBAGE... >
<Value name="lookup_name" value="XYZ_DONE"/>
<OTHER GARBAGE... >
これにより、間にあるすべての行が印刷されますが、2つのバーは無視されます。
どのように動作しますか?
上記のコードは、開始パターンに一致する行を見つけ、2番目の一致する行に遭遇する<List Variable name="lookups">
まですべての行を見つけます<\/Variable>
。これらの間にある行はsed
削除されません!d
。他のすべての行はd
in!d
で削除されます。 2番目は//d
表示された行を削除します。
上記のタスクを実行してマーカーラインを印刷するには、上記のsed
コマンドを次のように変更できます。
$ sed '/<List Variable name="lookups">/,/<\/Variable>/!d' file.dat
<List Variable name="lookups">
<Value>
<Value name="lookups" value="LSM_OPT"/>
<OTHER GARBAGE... >
<Value name="lookup_name" value="123_Done"/>
<OTHER GARBAGE... >
<Value name="lookup_name" value="XYZ_DONE"/>
<OTHER GARBAGE... >
</Variable>