2017-06-23 4 views
1

私は正規表現が他のすべてのスクリプト言語で動作する理由を理解しようとしていますが、Webページを同じ表現でsedにパイプしているわけではありません。Regexはsed以外のどこでも動作します

私はこれを実行しているよ:

wget -qO- http://website.com/page.html | sed -n '/([0-9]+)(?=%<\/td>)/g'

私は "%</TD>" の最後の出現の前に、すべての数字を探しています。

regexはPHP、Python、Ruby、javascriptで動作しますが、sedでは何も返しません。

どのようにsedで動作する正規表現を取得できますか?

+0

@anubhava doh!はい。 awkやgrepはありますか?または、表現を再考する必要がありますか? – Moses

+0

あなたは 'grep' - ' grep -oP '[0-9] +(?=%) 'を探しています。 –

+0

@WiktorStribiżew素晴らしい。そのトリックをした。答えとして投稿しても構いません。魅力的に働いた。 – Moses

答えて

1

sedは、ファイルの文字列の削除/置き換えによく使用されます。 と一致する必要があるので、grepは便利です。特に、PCRE正規表現パターン(lookbehindとlookaheadの両方を許可する)を使用できるようにする-Pオプションが便利です。

だから、あなたのケースでは、あなたが

grep -oP '[0-9]+(?=%</td>)' 

を使用することができ-oオプションが出力のみマッチし、-Pはパターンを解析PCRE正規表現エンジンをイネーブルにします。

Ubuntuの14とのみ<td>word 15%</td><td>word 85%</td><td>word 6%</td><td>word 1865%</td>ライン持つファイルのテスト:

enter image description here

+1

私は以前grepで試してみたところで '-P'スイッチを認識していなかったので、先読みがうまくいきませんでした。ありがとう! – Moses

1

は、すべてのツールは、特定の正規表現のバリアントをサポートし、いくつかの追加の注意事項およびいくつかのツールを持っているあなたが渡すものを引数に応じて、異なる味をサポートします彼らへ。

sedはデフォルトでBREをサポートしており、一部のseds(GNUおよびOSX)は-Eで有効になっていてPCREをサポートしていない場合でもEREをサポートしています。

grepは、デフォルトでBREをサポートし、有効にするとEREは-E、有効にするとPCREは-Pとなります。しかし-PはGNU grepであり、そのmanページには機能がhighly experimentalだからYMMVを使っていると書かれているので、それは言及する価値があります。

awkはEREのみをサポートしています。

I think perlはPCREのみをサポートしていますが、マニュアルページを確認する必要があります。

与えられたサンプルの入力と、我々はどのようにPCREを必要とせずにそれの代わりに、あなたがやりたいことをあなたに示すことができ、出力期待 - それはあなたが必要とするすべてのように聞こえるの推測では、次のとおりです。

sed 's:.*\([0-9]*\)%</td>.*:\1:' 

ているだろうすべてのUNIXボックス上のすべてのsedsで動作します。

関連する問題