次の構造に一致するファイルのテキスト部分を表示するためにパターンマッチングを実行したいと思います。
## 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に慣れていない場合は、p
awkスクリプトでセミコロンの後の最後のエントリがp
trueかどうかをテストし、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
($p
perlの場合)は、パターンが表示されたときに印刷のオンとオフを切り替えるトグルスイッチとして使用されます。
どちらのスクリプトもいくつかのコード冗長性が必要です。切り替えp
(または)するコードブロックは真である$p
ことを確認し、真であればp
印刷する必要があります。今後スイッチp
。それ以外の場合は、p
「pがtrueの場合は印刷」テストを実行する前に閉じるため、目的のブロックの最後の行は印刷されません。
注:[[:blank:]]
スペースまたはタブを表します。パール\h
の意味どの水平スペース(ロケールに応じて一部のUnicodeスペース文字を含む)実際には両方ともASCIIテキストに同じ効果があります。
2つの条件をテストする必要がある場合は、2つの変数(たとえば、およびp1
(p2
そしてperlの場合$p1
))を使用してください。$p2
別々にテストし、両方が真の場合にのみ印刷します(例:p1 && p2
awk、print if ($p1 && $p2)
perl)。
シェル変数は、コマンドラインまたは環境変数(export
すべての子プロセスの環境で使用可能なbashの変数)を介してシェルからawkまたはperlに渡すことができます。