0
<block id="123">
    <othertag1>...</othertag1>
    <othertag2>...</othertag2>
    <picture>...</picture>
    <othertag3>...</othertag3>
    <othertag4>...</othertag3>
</block>

タグのない多くのファイルでそのようなブロックをどのように使用agまたは検索しますか?grep <picture>

そして高度な:それらのタグ"id"から取得します。<block>(たとえば、リストとして stdout に出力します)。

4

2 に答える 2

1

はい、ハンマーを使ってそのネジを打ち込むことができます。
ただし、ドライバーをお勧めします。
つまり、それを解決するために作成されたツール、XPath を使用するということです。

/block[not(picture)]

ストレッチゴールの場合:

/block[not(picture)]/@id

XML を解析する場合は、XPath を使用する必要があります。

于 2016-09-28T14:47:44.673 に答える
0

必要に応じて、ドット マッチに改行が含まれるパール正規表現を使用できます。たとえば、次のように使用します。

ag '(?s)<block(?!.*?picture).*?</block>'

これにより、複数の行にまたがるブロック タグ間のコンテンツが返されますが、2 つのブロック タグの間にピクチャ タグを含むブロックは除外されます。

(?s) は を意味します。一致には改行が含まれます。?! *? は否定的な先読みで、この場合は「picture」という単語の場合です。最初の画像と最初のブロックまで貪欲でない検索です。

注: この検索パターンが機能しないまれなケースがあると確信していますが、私のクイック テストはうまく機能しました。

結果を ID だけにさらに制限したい場合は、別の ag を結果にパイプします。

ag '(?s)<block(?!.*?picture).*?</block>' <directory with files> | ag -o 'id="([0-9]+)"' 
于 2017-01-10T21:33:59.113 に答える