それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

君は、grep -o オプションを知っているか?(grepでマッチした部分のみ抽出、後方参照の¥0)

grep -o オプションを知ったかぶりしてみた。

grep で後方参照的なことをやろうと思うと、 -o オプションを使うと便利。


GREPコマンドは、マッチ行を取り出すので、MATCH部分を取り出すのはちょっと手間。

grep -o "<div id=“content”>.*"

でマッチした箇所だけを取り出す。

これでちょっとした解析がとても楽になります。

マッチ部を取り出す。

つまりあるキーワードを含む「行」ではなく「マッチ部分」を取り出す


grep -o で該当部分を取り出す

takuya@air:~$ curl mixi.jp | grep -o "<script[^>]*>[^<]*</script>"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 11073    0 11073    0     0  23439      0 --:--:-- --:--:-- --:--:-- 31547

<script type="text/javascript" src="/static/js/lib/json.js?1317794491"></script>
<script type="text/javascript" src="/static/js/lib/prototype-effects-1.6.0.2-1.8.1-compress.js?1289301118"></script>
<script type="text/javascript" src="/static/js/lib/underscore-string-1.2.3-2.0.0-compress.js?1326782208"></script>
<script type="text/javascript" src="/static/js/lib/namespace-brook-compress.js?1322460198"></script>
<script type="text/javascript" src="/static/js/mixi.js?1318390340"></script>
<script type="text/javascript" src="/static/js/lib/jquery-1.7.1.min.js?1326953090"></script>
<script type="text/javascript" src="/static/js/lib/jquery-noconflict.js?1326953090"></script>
<script type="text/javascript" src="/static/js//mixi/analysis.production.js?1320904321"></script>
<script type="text/javascript" src="/static/js/lib/prototype/replacer_for_array_prototype.js?1321855252"></script>
<script type="text/javascript" src="/static/js/jp/mixi/ad/expander.js?1329976799"></script>

例2

takuya@air:~$ curl mixi.jp | grep -o "<div[^>]*>[^<]*"
<div id="page">
<div id="headerArea">
<div id="globalNavigation">
<div id="loginBodyArea">
<div id="loginMain">
<div id="loginArea">
<div id="footerArea">
<div class="footerMain">

ある正規表現マッチした箇所を取り出すことが出来るようになります。
つまり、ファイルからマッチする部分を取り出せばいいのです。テキストファイル最高

ruby の次と同じ

 html = open("http://mixi.jp").read
 html =~ %r'<div id=“content">*.</div> ‘
 puts $1

に相当する。


一気にできるのは好感度高い。
ワンライナーrubyでかいておくのもいいけど、Grepも便利。

もうSEDRubyで変換しなくていいんです

マッチ部分を取り出すためだけにruby ワンライナー作ってたけど。もう大丈夫。


grep -o オプションのman ページ

   -o, --only-matching
              マッチする行のマッチした部分だけを (それが空文字列でなければ) 表示します。 マッチした各文字列は、それぞれ別の行に書き出します。

どうでもいいけどmixi・・・って

mixi.jpのJavascript、似たようなライブラリ大量に使って使い方汚すぎんよ。

その他の方法

コマンドでやるなら、GREPを使うより、BASHBASH_REMATCHを使うほうが楽だと思う。

bashの正規表現マッチで後方参照 - それマグで!


2021-02-03

BASH_REMATCHについて言及