2010-11-19 25 views
10

私は以下の内容をfoo.txtのファイルがあるとします。私は、次のと日付部分についてack、それが動作するときack出力に名前付き正規表現グループを使用するには?

[2010-11-13 12:00:02,656] 
[2010-11-13 12:00:02,701] 
[2010-11-13 12:00:02,902] 

を:

ack "(?P<foo>\d{4}-\d{2}-\d{2})" foo.txt --output "\$1" 

2010-11-13 
2010-11-13 
2010-11-13 

しかし、私は--outputを使用しようとすると、グループ「FOO」で、私はそれを動作させることはできません。

ack "(?P<foo>\d{4}-\d{2}-\d{2})" foo.txt --output "(?P=foo)" 

(?=foo) 
(?=foo) 
(?=foo) 

すべてのヘルプ、それを大幅に感謝しているし。本当にありがとう。

+0

注:名前の正規表現のグループを使用すると、あなたの根本的なPerlのに依存しています。名前付きの正規表現グループはPerl 5.10で導入されましたが、古いPerlでackを使用している場合(ackはPerl 5.8でも動作するので)、動作しません。 –

答えて

16
ack "(?P<foo>\d{4}-\d{2}-\d{2})" foo.txt --output "\$+{foo}" 

(?P=foo)のみ内の正規表現は、(それが\1の命名同等です)動作します。 $+{foo}は、$1という名前の同等品です。

また、ほとんどのシェルで、単一引用符を使用すると、余分なバックスラッシュを防ぐことができます:

ack '(?P<foo>\d{4}-\d{2}-\d{2})' foo.txt --output '$+{foo}' 
+4

'(?P ...)の' P '部分は省略可能です。つまり、単純な '(? ...)'がたくさんあります。 – tchrist

関連する問題