テキスト部分の一致

テキスト部分の一致

次の構造に一致するファイルのテキスト部分を表示するためにパターンマッチングを実行したいと思います。

## DN [Pattern-Matching] glob,regex
## Some text
## More text
## DN [Pattern-Matching] ends here

文法

## DN [TITLE] KEYWORD[,KEYWORD..]
## Some text
## More text
## DN [TITLE] ends here

タイトルでは、TITLEはキーワード(カンマで区切られた複数のキーワード)と一緒に使用されます。

このセクションを表示するには、ユーザーがまたはを提供TITLEしますKEYWORD

次のタグから始めましょう

  lab="## DN [Something]"

上記で完成したパターンと一致します。

  if [[ "$lab" =~ ^[[:space:]]*([#;!]+|@c|//)[[:space:]]DN[[:space:]]\[.*\]$ ]]; then

これで、追加のキーワード部分を一致させる必要があります。

最後に合わせたい部分はkeyword,keyword

私はこれを始めました([^,]+)。私の混乱は、,keywordこれ以降にゼロ以上の残りの可能性を一致させることです。

ベストアンサー1

テキスト処理には bash ではなく awk または perl を使用してください。

たとえば、awkを使用すると、次のようになります。

awk '/^[[:blank:]]*##[[:blank:]]+DN[[:blank:]]+\[TITLE\]/ {
       if (p) print;
       p = ! p
     };
     p' input.txt 
## DN [TITLE] KEYWORD[,KEYWORD..]
## Some text
## More text
## DN [TITLE] ends here

しかし、awkに慣れていない場合は、pawkスクリプトでセミコロンの後の最後のエントリがptrueかどうかをテストし、trueの場合は現在の行を印刷します{if (p) print}。つまり、awk スクリプトは awk スクリプトで構成されます。一連の「PATTERN ACTION」ルールで、PATTERNまたはACTIONは省略できます。パターンは真または偽として評価されるすべてです。 PATTERN を省略すると、デフォルト値は true です。つまり、常に ACTION が実行されます。 ACTION は実行する awk コードです。 ACTIONを省略すると、デフォルトはACTIONですprint

またはパールを使用してください:

$ perl -ne 'if (/^\h*##\h+DN\h+\[TITLE\]/) {
              print if $p;
              $p = ! $p
            };
            print if $p' input.txt 
## DN [TITLE] KEYWORD[,KEYWORD..]
## Some text
## More text
## DN [TITLE] ends here

どちらのスクリプトも同じように動作します。つまり、お互いを直接翻訳することです。

どちらのスクリプトでも、変数p$pperlの場合)は、パターンが表示されたときに印刷のオンとオフを切り替えるトグルスイッチとして使用されます。

どちらのスクリプトもいくつかのコード冗長性が必要です。切り替えp(または)するコードブロックは真である$pことを確認し、真であればp印刷する必要があります。今後スイッチp。それ以外の場合は、p「pがtrueの場合は印刷」テストを実行する前に閉じるため、目的のブロックの最後の行は印刷されません。

注:[[:blank:]]スペースまたはタブを表します。パール\hの意味どの水平スペース(ロケールに応じて一部のUnicodeスペース文字を含む)実際には両方ともASCIIテキストに同じ効果があります。


2つの条件をテストする必要がある場合は、2つの変数(たとえば、およびp1p2そしてperlの場合$p1))を使用してください。$p2別々にテストし、両方が真の場合にのみ印刷します(例:p1 && p2awk、print if ($p1 && $p2)perl)。

シェル変数は、コマンドラインまたは環境変数(exportすべての子プロセスの環境で使用可能なbashの変数)を介してシェルからawkまたはperlに渡すことができます。

おすすめ記事