ファイルがあるとしましょう。
# file: 'test.txt'
foobar bash 1
bash
foobar happy
foobar
「foobar」の後にどの単語が続くかを知りたいので、次の正規表現を使用できます。
"foobar \(\w\+\)"
括弧は、私がfoobarの後の単語に特に興味があることを示します。しかし、これを行うと、grep "foobar \(\w\+\)" test.txt
「foobarの後の単語」だけでなく、正規表現全体に一致する行全体が得られます。
foobar bash 1
foobar happy
私はコマンドの出力が次のようになりたいと思います。
bash
happy
正規表現のグループ化(または特定のグループ化)に一致する項目のみを出力するようにgrepに指示する方法はありますか?
ベストアンサー1
GNU grepには、-P
Perlスタイルの正規表現オプションとパターンに-o
一致するもののみを印刷するオプションがあります。これはLookaroundアサーションを使用して組み合わせることができます(以下の説明を参照)。Perlre マンページの拡張モード)は、ターゲットと一致すると判断されたものからgrepパターンの一部を削除します-o
。
$ grep -oP 'foobar \K\w+' test.txt
bash
happy
$
これは、出力したいテキストの前に幅0のLookBehindアサーションとして使用できる\K
短い形式(より効率的です)です。出力するテキストの後に幅0の予測アサーションとして使用できます。(?<=pattern)
(?=pattern)
foo
たとえば、との間の単語を一致させるには、bar
次のようにします。
$ grep -oP 'foo \K\w+(?= bar)' test.txt
または(対称のため)
$ grep -oP '(?<=foo )\w+(?= bar)' test.txt