この出力を取得するにはどうすればよいですか?
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]
意味します。これらの違いは、次を参照してください。\d
grep
[0-9]、[[:digit:]]、\dの違い。
質問に示されている3つの異なる出力を取得するには、代わりにsed
を使用してくださいgrep
。これを使用したいのは、sed
一致grep
する行(または単語)のみを印刷でき、一致するデータを実際に変更できないためです。
Found value:
数字を含む行の前に挿入し、その行を印刷します。$ sed -n '/[[:digit:]]/s/^/Found value: /p' line.txt Found value: This order was placed for QT3000! OK?
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
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
最後の数字だけが一致します。.*