それで時間がかかりましたが、いよいよ知りました。考える正規表現に関する限りkwrite
。
しかし、私はまだその知識をどのように翻訳するのかわかりませんgrep
。私が何をしているのかを知ると、私は気に入っていますが、grep
マニュアルはいつも私に頭痛を与えます。
次の行のような内容を一致させたい。
改行の後の大文字。 CAPI TALSFOLLお世話になった 新しいライン。
つまり、2つ以上の大文字で始まる行です。しかし、どうすればいいのかわかりません。
では、kwrite
次を使用して次の行を一致させます。
\n[A-Z][A-Z]+
しかしgrep
…まあ。私は次のような感じがあります。
me@ROOROO:~/$ grep "^[A-Z]something" filename
しかし、
me@ROOROO:~/$ grep "^[A-Z][A-Z]+" filename
効果はありません(空のファイルを返します)。インターネット検索では、「grepは1つ以上の用語に一致します」と信じています。
me@ROOROO:~/$ grep "^[A-Z][A-Z]*" filename
正しい構文です。しかし残念ながら、それは問題を解決しません。
ベストアンサー1
最初の例では正しい構文を使用しました。問題は、+
「拡張された」正規表現を使用する場合にのみ特殊と見なされることです。 GNU実装のマニュアルページからgrep
:
基本正規表現と拡張正規表現
基本正規表現では、メタ文字?、+、{、|、(および)はバックスラッシュバージョン\?、\+、\{、\|、\(および\)の代わりに特別な意味を失います。
(\?
、\+
および\|
は非標準 GNU 拡張です)。
したがって、エスケープする必要があります+
(GNUgrep
または互換性があると仮定)。
$ grep "^[A-Z][A-Z]\+" filename
\{1,\}
標準GNUに対応するものを使用してください\+
。
$ grep '^[A-Z][A-Z]\{1,\}' filename
ここでも:
$ grep '^[A-Z]\{2,\}' filename
grep
または、フラグを渡すか実行して-E
拡張正規表現を有効にしますegrep
(egrep
70年代後半にこれらの拡張正規表現を導入したコマンド)。
$ grep -E "^[A-Z][A-Z]+" filename
$ egrep "^[A-Z][A-Z]+" filename
とにかく、これらすべては機能的に次のとおりです。
$ grep '^[A-Z][A-Z]' filename
+
したがって、オペレータも必要ありません。
別の例では、以下を試しました。
$ grep "^[A-Z][A-Z]*" filename
*
デフォルトの正規表現で動作しますが、1回以上ではなく0回以上一致します。解決策は次のとおりです。あなたの答え「1つの大文字、他の大文字、0個以上の大文字と一致します」と表示されているので動作します。質問の方法は、「1つの大文字を一致させてから1つ以上の大文字を一致させる」と言います。これは同じです。を使用して、{min,max}
必要な正確な数字を指定することもできます。省略すると、max
任意の数字が許可されます(この場合も正規表現の拡張が必要です)。
$ egrep "^[A-Z]{2,}"
(歴史egrep
上、最初はサポートがサポートされていません(たとえば、{min,max}
Solaris 11ではまだサポートされていません)。サポートが追加される前に追加されました(この場合、実際には下位互換性が壊れています)。/bin/egrep
\{min,max\}
grep
{min,max}
egrep
egrep