存在するこれQ&Aには、以下に基づいて「緩い」リファレンスマニュアルページの概要があります。拡張 Backus-Knoll パラダイムメタグラム表現。楽しさと背景として機能します。つまり、関連用語を使用すると、マニュアルのコマンドの概要で見つけることができる最も一般的な要素タイプの1つは次のとおりです。オプションの注文;によって定義リスト間に囲まれた起動オプション記号そして終了オプション記号。多くの言葉では、私たちはそれを同様のものに関連付けることがよくあります[ option ]
。これは、単一のダッシュまたは長い二重ダッシュ形式の後に1つ以上の文字が続くことがありますps --help
。
そのため、マニュアルでよく見られる一般的なオプションのシーケンスパターンを一致させたいと思います。
- で始まり、
[
で終わる]
- オプションのシーケンスを含みます。形
-option
または--option
- 括弧内に必ず中央に配置する必要はありません
[-a]
。つまり、は[ -ab]
すべて[-abc ]
と一致します。 - オプションとオプション要素/指定子を含むリストが許可されます。
[-a foo -b bar -c=biz end]
- 他のカッコが外部カッコ内に表示されるようにします。つまり、
[--a [-b[-c]] -d foo]
(ここでは入力全体と一致します)
...しかしいいえ許可する:
---
とにかく3つのダッシュ- より明確に言えば
[option]
(ダッシュなしで)および[]
、[-]
または単独で一致してはいけません。[--]
[foo-bar=a]
データには、上記の例のように、あまりにも多くの異常が含まれていません。取引一致しない括弧もありますが、これはこの資料の範囲外です。grep
振り返ってみると、おそらく私のように要件を解決しようとするのが最善のアイデアではなかったでしょう。しかし、私は次のように試しました。
grep -E '\[{1,}([[:space:]]{0,}[[:punct:]]{0,}[[:alnum:]]{0,}){0,}(-{1,2}[[:alpha:]]{1,}){1,}([[:alnum:]]{0,}[[:punct:]]{0,}[[:space:]]{0,}){0,}\]{1,}'
どのパターン1と一致し、私が望むものを実行しますが、管理と再利用が難しいという欠点があります。 「チャンク」を生成するために一致する反復を管理するために、任意の角かっこセット(3)を使用して項目をグループ化することもこの点では役に立ちません(ただし、デバッグには役立ちます)。入力を提供するために文字クラスを使用することは、やや予測できないようです。
それでは、より良い表現や他のツール/アプローチを使用してこれをどのように実行できますか?このように長い正規表現を使用している場合は、どのように管理しますか?どのような場合は、コンテンツをフィルタリングするためにコマンドを複数回使用する必要がありますか?この問題を解決するのに役立つように、事前にコンテンツを異なる方法で操作する必要がありますか?
1.中出力マニュアルページファイルを繰り返すと、優れたテスト機会が得られます。ここでは、for i in /usr/share/man/man1/*.gz; do basename "${i//.1.gz}"; my_grep_command_above <<< "$(man -l "$i")"; done
完全なマンページ出力を使用してgrepを使用しました。それ以外の場合は、man man
テストman as
用の代替シーケンスの良いバリエーションを提供してください。
答え1
次のようにできます(GNUを使用grep
)。
grep -Po '\[\s*--?(?!-)((?>[^][]+)|\[(?1)*\])+\]'
ご質問には次の内容が記載されています。
[-a]
[ -ab]
[-abc ]
[-a foo -b bar -c=biz end]
[--a [-b[-c]] -d foo]
アイデアは、pcrepattern(3)
マッチネストで説明されているように、PCREと対応する再帰マッチング演算子を使用することです[...]
。