4

次のような行が含まれるファイルがあります

data
datalater
983290842
Data387428later
datafhj893724897290384later
4329804928later

私がやろうとしているのは、正規表現を使用して、データで始まり、後で終わる行と、その間に数字がある行を照合することです。これが私がこれまでに作り上げたものです:

^[D,d]ata[0-9]*later$ 

ただし、出力にはすべてのデータ後の行が含まれます。出力をパイプして grep -v datalater にすることもできると思いますが、単一の式でうまくいくように感じます。

4

6 に答える 6

5

+の代わりに使用し*ます。

+上記の少なくとも 1 つ以上に一致します。
*0 個以上に一致します。

^[Dd]ata[0-9]+later$

grep では、 をエスケープする必要があります。文字クラスであり、1 桁の数字に一致する which を+使用できます。\d

^[Dd]ata\d\+later$

サンプルファイルには、次の行もあります。

datafhj893724897290384later

データと数字の間に文字があるため、これは現在一致しません。[^0-9]*これは、データの後に数字まで一致するように a を追加することで修正できます。

最終的なコマンドは次のとおりです。

grep '^[Dd]ata[^0-9]*\d\+later$' filename
于 2013-02-17T21:37:54.167 に答える
2

* 修飾子を使用して 0 個以上の数字を一致させています。試す

^[Dd]ata\d+later$

代わりは。また、文字列の先頭にコンマが見つかりました (例: ",ata1234later")。\d は、任意の数字を見つけるためのショートカットです。だから私もそれらを変更しました。

于 2013-02-17T21:41:27.690 に答える
1

Cygwin を使用すると、上記のコマンドが機能しませんでした。目的の結果を得るには、上記のコマンドを変更する必要がありました。

$ cat > file.txt <<EOL
> data
> datalater
> 983290842
> Data387428later
> datafhj893724897290384later
> 4329804928later
> EOL

私は常に、自分のファイルが期待どおりのものであることを確認したいと思っています。

$ cat file.txt
data
datalater
983290842
Data387428later
datafhj893724897290384later
4329804928later

$

-Pフラグを使用して Perl スタイルの式を実行する必要がありました。これは[^0-9]+、@Tom_Cammann がその必要性を適切に指摘した を使用できないことを意味しました。代わりに.*、パターンの次の部分に一致しない任意の文字列に一致する which を使用しました。これが私のコマンドと出力です。

$ grep -P '^[Dd]ata.*\d+later$' file.txt
Data387428later
datafhj893724897290384later

$

Perl の式が必要な理由について、より良い説明ができればと思いますが、Cygwin のgrep動作が少し異なることだけは知っています。

システム情報

$ uname -a
CYGWIN_NT-10.0 A-1052207 2.5.2(0.297/5/3) 2016-06-23 14:29 x86_64 Cygwin

以前の回答からの私の結果

$ grep '^[Dd]ata[^0-9]*\d\+later$' file2.txt

$ grep '^[Dd]ata\d+later$' file2.txt

$ grep -P '^[Dd]ata[^0-9]*\d\+later$' file2.txt

$ grep -P '^[Dd]ata\d+later$' file2.txt
Data387428later

$
于 2016-08-20T01:14:37.847 に答える
1

「*」(ゼロ、1 つまたは複数を意味する)の代わりに「+」(1 つまたは複数を意味する)を入力する必要があります。

于 2013-02-17T21:39:52.570 に答える