RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのエンジニアブログ

edエディタについて調べてみた

はじめに

開発エンジニアのamdaba_sk(ペンネーム未定)です。 前々回前回と弊社エンジニアへのなんちゃってインタビューで記事を書いてきましたが、今回は久々に調べものをした結果をまとめてみようかと思います。

目次

経緯

実は私は自宅では非常に貧弱な性能のマシンしか持っていません。でもやっぱり家でも趣味の開発はしたいわけですが、まずエディタ選びが悩ましい。

Eclipseは動くには動くけどどうももっさりしてて使ってられない。Atomエディタも同じ感じ。Visual Studio CodeやGeanyという軽量エディタはわりとマシだったものの、時間が経つにつれてだんだん重くなっていく…。

結果ターミナルでvimという選択肢に行き着いたわけですが、やはりあまり使いこなせない。何とか使いこなせるようになろうとvimの操作を調べるうちに、ラインエディタというものの存在を知りました。

ラインエディタ

vi(vim)はスクリーンエディタというものに分類されるそうです。

テキストエディタといえば、画面上に編集するテキストを表示し、その上でカーソルを移動させて編集を行なうものを連想しますが、そういったエディタがスクリーンエディタと呼ばれます。

対してラインエディタでは、画面上への表示は最小限です。スクリーンエディタと異なり内容の閲覧/編集はそれぞれ独立した機能であり、目的の行を抽出、編集、更新というサイクルで編集を行います。

最初期のテキストエディタの形であり、スクリーンエディタの開発以前は主にこれが使用されていたようです。

ed の概要

ed はラインエディタの一つであり、初期の頃から存在する UNIX 上の標準的なテキストエディタの一つです。今も事実上全てのバージョンの UNIXLinux に装備されています。

ただ最近では vi や Emacs、その他のスクリーンエディタにとって代わられ ed を対話的に使用することは滅多に無いようです。ただ問題が発生したときには ed が使用可能な唯一のエディタである場合もあり、そのような場合に限って ed は対話的に使用されます。

またエディタコマンドは標準入力で受け取られるので、シェルスクリプト内で使用することが出来、そういった用途で使われることはあるようです。

edの機能

コマンドライン

ed を起動するには端末で以下のようにタイプします。オプションとファイル名を引数として指定できます。

ed [options] [file]

代表的なオプションは以下のものがあります。

オプション 長い書き方 説明
-h --help 使用法を表示して終了
-V --version バージョン情報を表示して終了
-l --loose-exit-status コマンド実行に失敗しても終了ステータス0を返す
-p STRING --prompt=STRING プロンプトとしてSTRINGを指定

モード

ed には、コマンドモードと入力モードがあります。

コマンドモードではエディタを操作するためのコマンドを入力してテキストの編集や置換、行の削除などを行っていきます。存在しないコマンドなどを入力したなどのエラー時は、?と表示されます。

入力モードでは、コマンドを実行することはできません。標準入力から入力されたデータは、 直接エディタバッファへと書き込みとされます。ピリオド1つだけの行を入力すると、入力モードを終了します。

コマンド一覧

行指定

ed では常に操作の対象となる行を指定する必要があります。

ed は現在行を管理しており、コマンドに行番号が指定されない場合は、現在行がデフォルト行として用いられます。ファイルが最初に読み出された直後は、現在行はファイルの最後の行となります。一般的に、現在行はコマンドが操作した最後の行となります。

なお行番号は1始まりです。

コマンド 内容
. 現在行
n n 行目
+n 現在行より n 行後の行
+ 現在行の1行後の行。+1と同じ
-n 現在行より n 行前の行
- 現在行より1行前の行。-1と同じ
$ ファイルの最終行
m,n m 行目からn 行目の範囲。m, nは数字または単一行指定コマンドを使用可能。e.g., 5行目から10行目を指定する場合は 5,10 、ファイル全体を指定する場合は1,$
, ファイル全体。 1,$ と同じ
; 現在行から最終行までの範囲。 .,$ と同じ
指定された行の操作

テキストの編集や置換、行の削除などは、行指定とコマンドを組み合わせて行います。以下の表では括弧書きした部分が行指定で、省略時のデフォルト動作を示しています。

コマンド 内容
(.)i 指定した行の前にテキストを追加。編集モードになる
(.)a 指定した行の後ろにテキストを追加。編集モードになる
(.,.)c 指定した範囲の行を削除して、そこにテキストを追加。編集モードになる
(.,.)d 指定した範囲の行を削除
(.,.)y 指定した範囲の行をカットバッファにコピー(yank)
(.)x カットバッファの内容を指定した行の後ろにペースト
(.,.)m(.) 左辺で指定した範囲の行を右辺で指定した行の後ろに移動。右辺には0を指定できる
(.,.+1)j 指定した範囲の行を連結
(.,.)p 指定した範囲の行を表示
(.,.)n 指定した範囲の行を行番号つきで表示
(1,$)g/reg/cmd 指定した範囲の行のうち、正規表現regと一致した文字列のある行に対し、cmdを実行
(.,.)s/reg/rep/n 指定した範囲の行のうち、正規表現regn番目に一致した文字列をrepに置き換える
(.,.)s/reg/rep/ 指定した範囲の行のうち、正規表現regと1番目に一致した文字列をrepに置き換える。s/reg/rep/1と同じ
(.,.)s/reg/rep/g 指定した範囲の行のうち、正規表現regと一致した文字列をすべてrepに置き換える
($)= 指定された行の行番号を表示
その他
コマンド 内容
u 直前のコマンド実行をアンドゥ。uコマンド自体もアンドゥできる
P コマンドモード時に、行頭にプロンプト文字列を表示。コマンドライン引数で文字列が指定されていない時は、 *が使用される。
!cmd cmd で指定したコマンドを、 sh を用いて実行
w [file] fileに編集内容を書き込み
q エディタを終了。編集内容が未保存の場合はエラー
Q エディタを終了。編集内容が未保存でも強制的に終了

ed を実際に使ってみた

edコマンドの使用例として、実際にファイルの編集を行ってみました。

とりあえず ed のバージョンを確認。1.1のようです。

$ ed --version
GNU Ed 1.1
Copyright (C) 1994 Andrew L. Moore, 2008 Antonio Diaz Diaz.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

適当なディレクトリに移動します。

$ cd /some/path
$ ls -a
./  ../

ファイルが何もないですが、せっかくなので ed で作ることにしましょう。

$ ed
P
*i
hoge hoge hoge
.
*=
1
*a
fuga fuga fuga
moge moge moge
piyo piyo piyo
.
*=
4
*w test
60
*q

最初にPコマンドを使用してプロンプトを出すようにしています。iaで行を追加。=で現在行の番号を確認しています。最後はwコマンドで"test"という名前でファイルに保存しました。

確認してみると、

$ ls
test
$ cat test
hoge hoge hoge
fuga fuga fuga
moge moge moge
piyo piyo piyo

思った通りにファイルが作成されていました。

起動時にファイル名を指定するとエラーが表示されるのですが、最後の保存時に名前を指定しなくてもよくなるようです。

$ ed test2
test2: そのようなファイルやディレクトリはありません
P
*i
hoge
.
*w
5
*q
$ ls
test  test2

次に作成したファイルを編集してみます。

$  ed test
60
P
*,n
1       hoge hoge hoge
2       fuga fuga fuga
3       moge moge moge
4       piyo piyo piyo
*2c
foo bar baz
spam ham egg
.
*,n
1       hoge hoge hoge
2       foo bar baz
3       spam ham egg
4       moge moge moge
5       piyo piyo piyo
*,s/moge/toto/g
*,n
1       hoge hoge hoge
2       foo bar baz
3       spam ham egg
4       toto toto toto
5       piyo piyo piyo
*wq
70

最初に行番号付きで現在のファイル内容を確認しました。その後cコマンドで2行目を変更し、ついでに新しい行を続けて入力しています。再度行番号付きで現在のファイル内容を確認すると、確かに2行目が変更され、その下に行が追加されていました。手入力で行の中の一部分を変更することはできないので、仮に同じ部分があったとしてもその行は全部書き直しです。

最後の保存と終了は同時に出来るみたいです。vi も同じですね!

ed 終了後にファイルの中身を確認すると、きちんと変更されていました。

$ cat test
hoge hoge hoge
foo bar baz
spam ham egg
toto toto toto
piyo piyo piyo
同じedでも環境によって違うこともある

Windowsにインストールした BusyBox 1.22.1に含まれる ed は、上でまとめたものとはオプションやコマンドが若干異なるようでした。

  • コマンドラインオプションが使えない
  • デフォルトでプロンプトが表示されている
  • プロンプト文字列は:
  • Pコマンドがない
  • 他にも違いはあるかも

おわりに

古くからあるがゆえに逆に知らなかったエディタ ed について調べてみました。

実際使ってみましたが、ファイル内が今どんな状態なのかがすぐにわからないのが少し不安に思いました。いくら軽量だとは言え普段使いするならやっぱりスクリーンエディタかな、というのが正直な感想です。ただシェルスクリプトで使うこともあるかも…。

なお今回まとめたのは ed のコマンドの中でも一部にすぎません。もっと詳しく知りたいなら参考に挙げたページや、manやinfoを見てくださいね。

参考

Copyright © RAKUS Co., Ltd. All rights reserved.