grepを使用して誤ったタイトルを識別する

grepを使用して誤ったタイトルを識別する

各ヘッダーの形式には、次のような数百の文書があります。

# 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型の正規表現を入れることはできず、固定長の文字列のみを使用できます。

grepPCREツールを使用してこれを行うことができます。

$ grep -vP "(?<=#)*\s*\w*\s*{.*}|^[#]+$" afile
# Lorem .tip}
# LIPSUM {.tip
# Title

動作原理:

  • (?<=#)*少なくとも1つ以上探す#
  • \s*\w*\s*スペース+単語+スペースの順序を見つけます。これはゼロ以上です。
  • {.*}{後ろに少なくとも1つの文字と終了者が来る}
  • |^[#]+$"#1つだけの行を探す

関連情報