sed、awk、または grep を使用した複数行パターンの一致

sed、awk、または grep を使用した複数行パターンの一致

sedを使用するか、awk複数行のパターンマッチングを実行できますかgrep?たとえば、{との間のすべての行を取得したいと思います。}

だから一致する必要があります。

 1. {}
 2. {.....}
 3. {.....
.....}

もともと、この質問は<p>例として使用されました。{とを使用するように質問を編集しました}

答え1

私は小さいか完全に一時的なものより小さいものを扱うことができるパーサーを取得したいという上記の提案に同意しますが、sedを使用して中括弧間の複数行ブロックを一致させることができます(ほぼ;-)。

これはsedコードのデバッグバージョンです。

sed -n '/[{]/,/[}]/{
    p
    /[}]/a\
     end of block matching brace

    }' *.txt

いくつかのメモ、

  • -n は「基本印刷行なしで処理」を意味します。
  • 「p」は意味するこの行を印刷してください。
  • この構文は/[{]/,/[}]/範囲式です。これは、最初のパターンと一致するものが見つかるまでスキャンし、(/[{]/)2番目のパターンが見つかるまでスキャンし、(/[}]/)sedコードの{}の間にあるすべての操作を実行することを意味します。この場合は「p」とデバッグコードです。 (ここでは説明していませんが、使用、修正、削除する方法の中から最適な方法を選択してください。)

コードが{、}で区切られたブロックと一致すると判断した場合は、ブロックデバッグの/ [}] / a \の末尾を削除できます。

このコード例では、中かっこペア内にないすべての項目をスキップします。上記で他の人が指摘したように、文字列、正規表現などに追加{、}を含めると簡単に混乱する可能性があります。OR同じ行に閉じる中括弧、(Fred.bearに感謝)

これが役に立つことを願っています。

答え2

pcregrepに-M(複数行)オプションを使用できます。

pcregrep -M '\{(\s*.*\s*)*\}' test.txt

\s は空白 (改行文字を含む) なので、0 個以上 (スペースの後に .* の後にスペースが続く) エントリと一致し、すべて中括弧で囲まれます。

修正する:

貪欲ではない一致が行われるべきです。

pcregrep -n -M '\{(\n*.*?\n*)*?\}' test.txt

答え3

XMLに似た式(無限再帰タグ)は「一般言語」ではないため、正規表現(regex)を使用して解析することはできません。理由は次のとおりです。

https://stackoverflow.com/questions/1732348/regex-match-open-tags-book-xhtml-self-contained-tags/

http://www.perlmonks.org/?node_id=668353

https://stackoverflow.com/questions/1379524/textual-protocol-which-is-not-a-regular-言語

答え4

正規表現は一致する入れ子括弧を見つけることができません。

検索中の角かっこに角かっこペアが入れ子になっていないと確信している場合は、最初の閉じ角かっこまで検索できます。たとえば、

sed -r 's#\{([^}])\}#\1#'

これにより、「{」と「}」の間のすべてのテキストがその間の内容に置き換えられます。

関連情報