綾小路龍之介の素人思考

[perl] perl ワンライナーでファイルの内容を一括で読み込むには-0777オプション

ファイルを行指向ではなくブロック的に取り扱いたいときにはファイルを一括で読む。これをするのが-0777オプション。

入力で使うファイルは以下

$ cat test.html
<p>test
<table>
<tr><th>and</th><th>0</th><th>1</th></tr>
<tr><th>0</th><td>0</td><td>0</td></tr>
<tr><th>1</th><td>0</td><td>1</td></tr>
</table>
</p>

置換を行って-0777のある場合と無い場合で比較するとわかりやすい。tdをthに置換することを考える。最初に一括読み込みの例。-eの内容は一回だけ実行されるので、一つ目のtdだけがthになっている。

$ perl -0777 -pe "s|<td>|<th>|" test.html
<p>test
<table>
<tr><th>and</th><th>0</th><th>1</th></tr>
<tr><th>0</th><th>0</td><td>0</td></tr>
<tr><th>1</th><td>0</td><td>1</td></tr>
</table>
</p>

行指向で読み込む例。-eの内容は行数と同じ回数実行されるので各行の1つ目のtdがthに変換されていることがわかる。

$ perl -pe "s|<td>|<th>|" test.html
<p>test
<table>
<tr><th>and</th><th>0</th><th>1</th></tr>
<tr><th>0</th><th>0</td><td>0</td></tr>
<tr><th>1</th><th>0</td><td>1</td></tr>
</table>
</p>

行指向ではなくブロック指向にデータを扱う良い例は、tableブロックを削除するだ。以下のようにして削除できる。置換はs///sのようにし(置換演算子sにsオプションを加え)、.を改行にマッチするようにした。

$ perl -0777 -pe "s|<table>(.*?)</table>||s" test.html
<p>test

</p>

-0777を削除すると以下のようになる。行指向でデータを取り扱ってしまうと、期待通りには動かない。

$ perl -pe "s|<table>(.*?)</table>||s" test.html
<p>test
<table>
<tr><th>and</th><th>0</th><th>1</th></tr>
<tr><th>0</th><td>0</td><td>0</td></tr>
<tr><th>1</th><td>0</td><td>1</td></tr>
</table>
</p>

リファレンス

  1. perl 0777 - Google 検索
  2. Perl one liner 集 perl 1行野郎
  3. 複数行を単位としたログを grep する perl one liner
  4. Perl の正規表現のFAQやTIPS等

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2010-02-24T07:14:56+09:00
  2. Modified: 2010-02-24T07:14:56+09:00
  3. Generated: 2017-03-04T23:09:18+09:00