2011-09-09 5 views
4

入力:パイソン抽出するワンライナーフィールド

$ ./ffmpeg -i test020.3gp                            
ffmpeg version UNKNOWN, Copyright (c) 2000-2011 the FFmpeg developers 
    built on May 5 2011 14:30:25 with gcc 4.4.3 
    configuration: 
    libavutil 51. 2. 0/51. 2. 0 
    libavcodec 53. 3. 0/53. 3. 0 
    libavformat 53. 0. 3/53. 0. 3 
    libavdevice 53. 0. 0/53. 0. 0 
    libavfilter 2. 4. 0/2. 4. 0 
    libswscale 0. 14. 0/0. 14. 0 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test020.3gp': 
    Metadata: 
    major_brand  : 3gp4 
    minor_version : 512 
    compatible_brands: 3gp4 
    creation_time : 2004-07-01 09:59:21 
    Duration: 00:01:02.20, start: 0.000000, bitrate: 284 kb/s 
    Stream #0.0(und): Audio: aac, 44100 Hz, stereo, s16, 96 kb/s 
    Metadata: 
     creation_time : 2004-07-01 09:59:21 
    Stream #0.1(und): Video: mpeg4, yuv420p, 176x120 [PAR 1:1 DAR 22:15], 184 kb/s, 15 fps, 15 tbr, 30k tbn, 15 tbc 
    Metadata: 
     creation_time : 2004-07-01 09:59:23 
At least one output file must be specified 

のは、私は、次の正規表現を使用して幅&高さを抽出したいとしましょう:Perlを使って

(\d+x\d+) 

、私がやるんだろうこのような何か:

$ ./ffmpeg -i test020.3gp 2>&1 | perl -lane 'print $1 if /(\d+x\d+)/' 
176x120 

その後、私はそれがソートの作品、同様のパイソンワンライナーを構築しようとしたと思いますが、

$ ./ffmpeg -i test020.3gp 2>&1 | python -c "import sys,re;[sys.stdout.write(str(re.findall(r'(\d+x\d+)', line))) for line in sys.stdin]" 
[][][][][][][][][][][][][][][][][][][]['176x120'][][][] 

perl1に対応するPythonの1ライナーはどうなっていますか?

答えて

5

re.findallの代わりにre.searchが必要です。 (

% cat /tmp/p 2>&1 | python -c "import re,sys; print re.search(r'(\d+x\d+)', sys.stdin.read()).group()" 
176x120 

あなただけgrepを使用していない何らかの理由:

これはワンライナー自体が「醜い」ビット(/tmp/pはあなたが与えただけでサンプルデータである)であっても、トリックを行いますこの場合egrep)?

% cat /tmp/p | egrep -o '[0-9]+x[0-9]+' 
176x120 
+3

これは、最初の投稿を取得する方法です。すぐに解決策があります:-) –

+0

私はそれを失ってしまいました。今戻ってきた! – jathanism

+0

@ jathanism:これは、回答をアクティブ、古い、または投票で並べ替えるかどうかによって異なります。 – MattH

2
cat sample.txt | python -c "import sys,re; print '\n'.join(re.findall(r'(\d+x\d+)',sys.stdin.read()))" 
176x120 
2

私はワンライナーをより快適にパイソンを作成する作業をするためにしようとmodule in the worksを持っています。 PythonのRubyとPerlの-n-e-l-pのオプションと考えることができます。

$ pip install oneliner 
# use as pyl-$major-$minor <args> or python -m oneliner <args> 

$ pyl-2.7 -j -ne 're.findall("\d+x\d+", line)' < ffmpeg.txt 
関連する問題