正規表現や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 を含む行を対象に、bar を baz へ変更する
という処理になります。
ここには、
パターン → 処理
という形があります。
これはAWKの、
/foo/ { print }
という考え方にも通じます。
ed は非常に小さなエディタですが、Unixのテキスト処理で繰り返し登場する考え方を、対話的に体験できます。
あえて「cを使わない」という練習
ed には、行全体を書き換える c コマンドもあります。
しかし訓練目的なら、簡単に c を使わない方が面白いかもしれません。
pで現在の内容を見る- できるだけ
s///で変更する - 複数の行なら
g//を考える - 行そのものの操作なら
a、i、d、m、tを使う - どうしても面倒なら
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 で編集してみる。
意外と、それが実践的な練習になるのかもしれません。


コメント