正規表現が身につかないなら「ed」を使ってみる|Unixのテキスト処理を鍛える古いエディタ

正規表現やsedを勉強したことはあっても、普段の編集ではあまり使わない。

そんな人は意外と多いのではないでしょうか。

理由を考えてみると、単純なことに気づきます。

普通のエディタでは、正規表現を使わなくても困らないからです。

たとえば、

This is a pen.

を、

This is a pencil.

に変更するとします。

現在の一般的なエディタなら、pen のところまでカーソルを移動して、削除して、pencil と入力すれば終わりです。

ところが、昔のUnixで使われていたラインエディタ ed では、そうはいきません。

そこで使うのが、

s/pen/pencil/

です。

この制約が、意外と良い訓練になります。

目次

edではテキストを直接触れない

ed は現在の一般的なエディタとはかなり違います。

ファイルを開いても、画面に全文が表示されるわけではありません。

現在行を見たければ、

p

で表示します。

たとえば、

p
This is a pen.

と表示されたとします。

この一部分を変更したければ、

s/pen/pencil/

と入力します。

もう一度、

p

とすると、

This is a pencil.

になっています。

つまり、

変更前
This is a pen.

      ↓ s/pen/pencil/

変更後
This is a pencil.

という因果関係が非常にはっきりしています。

「どう操作するか」ではなく「どう変換するか」を考える

一般的なエディタでは、

カーソルを移動する
↓
文字を削除する
↓
新しい文字を入力する

と考えます。

一方、ed では、

penをpencilに変更する

と考え、それを、

s/pen/pencil/

と表現します。

ここには大きな違いがあります。

前者は操作手順を考えています。

後者は変換規則を考えています。

ed を使っていると、自然と後者を考える機会が増えてきます。

正規表現を使う機会が自然に増える

たとえば、行頭から続く半角スペースを削除したいとします。

一般的なエディタなら、行頭へ移動してBackspaceやDeleteで消してしまうでしょう。

ed なら、

s/^ *//

のように表現できます。

数字の部分を変更したければ、

s/[0-9][0-9]*/100/

といった書き方もできます。

正規表現の本を読んで、

^
$
*
[]

といった記号を覚えるのとは少し違います。

実際に文章を直すために、正規表現を使う機会が自然に増える。

この違いは大きいと思います。

grepの考え方にもつながる

ed では正規表現による検索ができます。

/error/

とすれば、error という正規表現に一致する行を探せます。

さらに、

g/error/p

とすれば、一致するすべての行を表示できます。

これは、

grep 'error' file.txt

にも通じる考え方です。

どちらにも、

パターンを指定する
↓
一致する行を対象にする

という発想があります。

sedのsコマンドも身近になる

ed で、

s/foo/bar/

を何度も使っていると、sed の、

sed 's/foo/bar/' file.txt

も理解しやすくなります。

ed では、対話しながら対象の行を変換できます。

sed では、入力を順番に読みながら指定した処理を適用していきます。

両者の動作モデルは同じではありませんが、s/old/new/ という編集表現を共有しています。

先に ed で一回の変換を経験しておくと、sed の置換が何をしているのかイメージしやすくなります。

AWKの「パターンと処理」にもつながる

さらに ed では、

g/foo/p

のように、一致する行を対象としてコマンドを実行できます。

たとえば、

g/foo/s/bar/baz/

なら、

foo を含む行を対象に、barbaz へ変更する

という処理になります。

ここには、

パターン → 処理

という形があります。

これはAWKの、

/foo/ { print }

という考え方にも通じます。

ed は非常に小さなエディタですが、Unixのテキスト処理で繰り返し登場する考え方を、対話的に体験できます。

あえて「cを使わない」という練習

ed には、行全体を書き換える c コマンドもあります。

しかし訓練目的なら、簡単に c を使わない方が面白いかもしれません。

  1. p で現在の内容を見る
  2. できるだけ s/// で変更する
  3. 複数の行なら g// を考える
  4. 行そのものの操作なら aidmt を使う
  5. どうしても面倒なら c で書き直す

一般的なエディタなら数秒で終わる変更を、あえて、

s/何を/何に/

と考えてみます。

効率だけを考えれば遠回りです。

しかし、その制約によって**「変更を規則として表現する」**訓練になります。

edをメインエディタにする必要はない

もちろん、今からすべての編集を ed で行う必要はありません。

コードを書いたり、長い文章を編集したりするなら、Vim、Emacs、Visual Studio Codeなどの方が便利です。

しかし、短い設定ファイルやメモなどを、あえて ed で編集してみる。

すると、

手で直す

より先に、

これ、s///で表現できないか?

と考える機会が増えます。

同じ変更が何度も出てくれば、

g//でまとめられないか?

と考える。

さらにファイル全体や複数ファイルを処理したくなれば、grep、sed、AWKといったUnixのテキスト処理ツールも自然と選択肢に入ってきます。

edは「Unixテキスト処理の練習機」なのかもしれない

ed は古いエディタです。

現代のエディタと比べれば、不便なところはいくらでもあります。

しかし、その不便さには面白い効果があります。

テキストをカーソルで直接操作できないから、変更を規則として表現する機会が増える。

検索する
/regexp/

置換する
s/old/new/

一致する行を対象にする
g/regexp/

削除する
d

移動する
m

こうして見ると、ed は単なる古いエディタではありません。

正規表現、grep、sed、AWK、そしてVimのExコマンドにも通じる、Unixのテキスト処理の考え方を小さな環境で体験できます。

正規表現を覚えようとしても、なかなか使う機会がない。

そんなときは正規表現の問題集を解くだけでなく、普段ならカーソルで直している小さなファイルを、あえて ed で編集してみる。

意外と、それが実践的な練習になるのかもしれません。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次