各ヘッダーの形式には、次のような数百の文書があります。
# Some title here {.WORD}
grep
私はこの規格に従わないすべてのヘッダーを識別したいと思います。ただし、#でのみ始まる行は検出されないでください。
## | OK
# Lorem .tip} | NOT OK
# LIPSUM {.tip | NOT OK
### Lipsum {.hello word} | OK
# Title | NOT OK
######## Title {.challenge} | OK
この状況を解決するために、次の正規表現を作成しました。
^##* .*(?<!{.*})$
しかし、パーサーは「lookbehindアサーションが固定長ではありません」と文句を言います。この問題を解決するために上記の正規表現を修正できますか?
答え1
$ grep -vE '^#+( [ [:alpha:]]+ \{\.[ [:alpha:]]+\})?$' file
# Lorem .tip}
# LIPSUM {.tip
# Title
拡張正規表現は「OK」行と一致します。-v
一致しない行を表示するように要求します。
このモードでは、行は#
特定の数の文字で始まる必要があります。行の残りの部分はオプションですが、存在する場合はスペースで始まり、その間にスペースを含めることができる複数の文字を含める必要があり、その前に最後のスペースを含める必要があります{
。{
and内の部分は}
ドットで始まり、特定の数の文字とスペースを含めることができます。
答え2
プレビュー/バックビューを使用すると、glob型の正規表現を入れることはできず、固定長の文字列のみを使用できます。
grep
PCREツールを使用してこれを行うことができます。
$ grep -vP "(?<=#)*\s*\w*\s*{.*}|^[#]+$" afile
# Lorem .tip}
# LIPSUM {.tip
# Title
動作原理:
(?<=#)*
少なくとも1つ以上探す#
\s*\w*\s*
スペース+単語+スペースの順序を見つけます。これはゼロ以上です。{.*}
{
後ろに少なくとも1つの文字と終了者が来る}
|^[#]+$"
#
1つだけの行を探す