grepを使用してグループ化された結果を取得するには?

grepを使用してグループ化された結果を取得するには?

この出力を取得するにはどうすればよいですか?

Found value: This order was placed for QT3000! OK?

または

Found value: This order was placed for QT300

または

Found value: 0

line.txtそして次のように使用してくださいpattern.txt

[nsaunders@rolly regex]$ 
[nsaunders@rolly regex]$ grep -e -f pattern.txt line.txt 
[nsaunders@rolly regex]$ 
[nsaunders@rolly regex]$ cat pattern.txt 
(.*)(\\d+)(.*)
[nsaunders@rolly regex]$ 
[nsaunders@rolly regex]$ cat line.txt 
This order was placed for QT3000! OK?
[nsaunders@rolly regex]$ 

使用似たような m.group(0)一つで地図時間正規表現について。

たぶんgrepそのようなことはないかもしれません。コンセプトように:

Groups and capturing
Group number

Capturing groups are numbered by counting their opening parentheses from left to right. In the expression ((A)(B(C))), for example, there are four such groups:

    1       ((A)(B(C)))
    2       (A)
    3       (B(C))
    4       (C)

Group zero always stands for the entire expression.

Capturing groups are so named because, during a match, each subsequence of the input sequence that matches such a group is saved. The captured subsequence may be used later in the expression, via a back reference, and may also be retrieved from the matcher once the match operation is complete. 

ベストアンサー1

想定されるパターンpattern.txtは次のとおりです。

(.*)(\d+)(.*)

まあ、GNUで使用するのはgrep問題になるでしょう

grep -E -f pattern.txt line.txt

つまり、質問のデータに基づいて、にリストされている拡張line.txt正規表現に一致する行を検索すると、次のようになります。pattern.txt

This order was placed for QT3000! OK?

コマンドの問題は-e -f-eオプションを使用して、「次の引数は式です」と明示的に言うことです。これは、-e -f「使用する正規表現は次のとおりです」と解釈されます-f。その後、それを適用して、コマンドラインに記載されている2つのファイルから一致するものを検索します。

2番目の問題は\\dファイルにありpattern.txt、バックスラッシュの後に文字が続くものと一致します。dこれはリテラル文字列です\d

このモデルにはいくつかの異なる「問題」があります。まず、非標準式を使用して数値を一致させます\d[[:digit:]]または、範囲[0-9](POSIX標準ロケール)で作成することをお勧めします。常に自動的に固定されるファイル名ワイルドカードパターンとは異なり、正規表現は部分文字列と一致するため、.*パターンは必要ありません。繰り返しますが、括弧はパターンで使用されないため、まったく必要ありません。単一の数字が前の式と一致するため、必要ありません+(単一の数字は「1つ以上の数字」を意味します)。

これは、(少なくとも)1つの数字を含むすべての行を抽出するためにパターンまたはを[[:digit:]]使用することができます。または、追加の変更なしでGNUでPerlなどの式を引き続き使用したい場合を[0-9]意味します。これらの違いは、次を参照してください。\dgrep[0-9]、[[:digit:]]、\dの違い

質問に示されている3つの異なる出力を取得するには、代わりにsedを使用してくださいgrep。これを使用したいのは、sed一致grepする行(または単語)のみを印刷でき、一致するデータを実際に変更できないためです。

  1. Found value: 数字を含む行の前に挿入し、その行を印刷します。

    $ sed -n '/[[:digit:]]/s/^/Found value: /p' line.txt
    Found value: This order was placed for QT3000! OK?
    
  2. Found value: 数字を含む行の前に挿入し、見つかった3番目の数字が終わるまでその行を印刷します。最大3番目の数字。行の最初の数字の部分文字列に連続した数字が少ない場合、最後に少ない数字が出力されることがあります。

    $ sed -n '/[[:digit:]]/s/\([^[:digit:]]*[[:digit:]]\{1,3\}\).*/Found value: \1/p' line.txt
    Found value: This order was placed for QT300
    
  3. Found value: 数字を含む行の前に挿入し、行の最後の番号を印刷します。

    $ sed -n '/[[:digit:]]/s/.*\([[:digit:]]\).*/Found value: \1/p' line.txt
    Found value: 0
    

使用したものと同等の正規表現を使用すると、一致するテキストビットを確認できます。

$ sed 's/\(.*\)\([[:digit:]]\{1,\}\)\(.*\)/(\1)(\2)(\3)/' line.txt
(This order was placed for QT300)(0)(! OK?)

前の数字は貪欲なので、行の\2最後の数字だけが一致します。.*

おすすめ記事