Linux の 101 試験対策: vi によるファイルの編集

ほとんどの Linux システムに備わるエディター

ほとんどすべての UNIX® および Linux® システムに備わっている vi エディターの使用方法を学んでください。この記事の内容は、Linux のシステム管理者として認定するための LPI 101 試験に備えるためにも、自ら活用するために学ぶ上でも役立ちます。

Ian Shields, Senior Programmer, IBM

Ian ShieldsIan Shields は、developerWorks Linux ゾーンの様々な Linux プロジェクトに関わっています。彼はノースキャロライナ州 Research Triangle Park にある IBM のシニア・プログラマーです。1973年にオーストラリアのキャンベラでシステム・エンジニアとして IBM に入社して以来、カナダのモントリオールやノースキャロライナ州 Research Triangle Park で、コミュニケーション・システムやパーベイシブ・コンピューティングに携わってきました。彼はいくつかの特許を保持しています。Australian National University にて純粋数学および哲学で学位を取得し、また North Carolina State University にてコンピューター・サイエンスで修士号と博士号を取得しています。Ian について詳しく知るには、My developerWorks で彼のプロフィールを見てください。


developerWorks 貢献著者レベル

2010年 2月 10日

この連載について

この連載は Linux システム管理タスクの学習に役立つだけでなく、LPIC-1 (Linux Professional Institute Certification レベル 1) 試験に備えるための教材にもなります。

連載の各記事についての説明とリンクについては、連載のロードマップを参照してください。現在進行中のこのロードマップは、LPIC-1 試験の最新の目標 (2009年4月) を反映しています。完成した記事はその都度ロードマップに追加されていきますが、当面は developerWorks の LPI 認定試験対策チュートリアルで同様の教材の以前のバージョンを調べてください。これらのバージョンは、2009年4月より前の LPIC-1 目標に対応しています。

概要

この記事では、ほとんどすべての Linux または UNIX システムで使用できる vi エディターの基本的な使用方法を説明します。この記事で説明する内容は以下のとおりです。

  • vi を使用して文書をナビゲートする方法
  • 基本 vi モードを使用する方法
  • テキストを挿入、編集、削除、コピー、および検索する方法

この記事は、Linux Professional Institute の Junior Level Administration (LPIC-1) 101 試験の主題 103 の 103.8 の試験対策となります。この目標の重要度は 3 です。

前提条件

この連載の記事を最大限に活用するには、Linux の基礎知識と、記事に記載されたコマンドを演習できる実際の Linux システムが必要です。プログラムのバージョンによって出力のフォーマットに違いが出てくる場合もあるため、コマンドの実行結果は必ずしもここに記載するリストや図とまったく同じであるとは限りません。


vi での文書のナビゲート

Ian とつながるには

Ian は developerWorks で人気の高いお馴染みの著者の 1 人です。Ian が書いたすべての developerWorks 記事を閲覧してみてください。また、My developerWorks では、Ian のプロフィールを調べることや、彼やその他の著者、そして他の読者とつながることができます。

vi エディターは、すべての Linux および UNIX システムに備わっていると言っても過言ではないほどです。実際、システムに 1 つのエディターしかないとしたら、そのエディターはおそらく vi のはずです。そのため、vi を使いこなす方法を知っておくことには価値があります。この記事では vi の基本的な編集コマンドを紹介しますが、vi エディターの詳細については、チュートリアル「vi intro -- the cheat sheet method」 または man ページ、あるいは数多くの優れた書籍などを参照してください。

vi の起動

ほとんどの Linux ディストリビューションには、従来の vi ではなく、Vim (Vi IMproved) エディターが同梱されています。Vim は vi と上位互換になっており、グラフィカル・モード (gvim) を使用できるだけでなく、標準 vi テキスト・モード・インターフェースも備えています。さらに、大抵の vi コマンドは、Vim では別名コマンドか、シンボリック・リンクになっています。Vim には、tiny、small、normal、big、huge といったバージョンがありますが、どのバージョンを実行しているのか、そしてどの機能が含まれているのかは、以下のコマンドで調べることができます。

vi --version

連載の以前の記事「Linux の 101 試験対策: プロセス実行の優先度」で取り上げた優先度の変更に関するセクションを思い出してください。あのセクションでは、実行中の count1.sh シェル・スクリプトを変更するという前提でしたが、これを自分で試してみると、コマンドの実行速度が速すぎて renice で優先度を変更するには時間が足りないことがわかったはずです。そこで今回は、vi エディターを使ってファイルの先頭に 20 秒間のスリープを設定する行を追加することにします。それによって、優先度を変更する余裕を設けようというわけです。

count1.sh プログラムを残していない場合は、ホーム・ディレクトリーでターミナル・ウィンドウを開いて、リスト 1 に記載するコマンドを貼り付けてください。これによって、lpi103-8 という名前のディレクトリーに count1.sh が作成され、カレント・ディレクトリーがこのディレクトリーに変更されます。

リスト 1. CPU を駆使するスクリプト - count1.sh

リスティングを見るにはここをクリック

リスト 1. CPU を駆使するスクリプト - count1.sh

mkdir -p lpi103-8 & cd lpi103-8 & {echo 'x="$1"'>count1.shecho 'echo "$2" $(date)'>count1.shecho 'while [ $x -gt 0 ]; do x=$(( x-1 ));done'>count1.shecho 'echo "$2" $(date)'>count1.sh
}

既存のファイルを編集するには vi コマンドを使用し、パラメーターとしてファイル名を指定します。使用できる数多くのオプションについての詳細は、man ページまたは「参考文献」を参照してください。ここでは以下のようにオプションを使わずに、このコマンドを実行します。
vi count1.sh
上記のコマンドを実行すると count1.sh ファイルが開き、リスト 2 のような内容が表示されるはずです。Vim を使用している場合には、いくつかの単語や文字がカラーで表示されていることでしょう。Vim には構文の強調表示モード (元の vi エディターにはありません) があり、システムではデフォルトで、このモードがオンに設定されます。

リスト 2. vi による count1.sh の編集
x="$1"
echo "$2" $(date)
while [ $x -gt 0 ]; do x=$(( x-1 ));done
echo "$2" $(date)
~
~
~
~
"count1.sh" 4L, 84C                                           1,1           All

vi エディターの起源は、すべての端末キーボードにカーソル・キーが備わっているわけではない時代に遡ります。そのため vi で実行できる操作はすべて、標準タイプライターに通常備わっているキーと、EscInsert などの少数のキーを使って実行することができます。その他のキーを使用できる場合には、vi が追加のキーを使用するように構成することも可能です。キーボードのほとんどのキーは、vi で何かしらの役に立ちます。vi ではカーソル・キーがない時代の遺産を引き継いでおり、また初期の端末では接続に時間がかかったことを考えると、vi が非常に短い暗号のようなコマンドを使用するという評判も納得できるはずです。そこで、まずはファイルをナビゲートするためのキーストロークから検討してみます。

さまざまなカーソル移動

ファイル内でカーソルを移動するには、以下のコマンドが役立ちます。

h
1 文字左に移動します。
j
次の行に移動します。
k
前の行に移動します。
l
1 文字右に移動します。
w
次の単語の先頭 (もしくは句読点) に移動します。
e
現在カーソルがある単語の末尾に移動します (カーソルが単語の末尾にある場合や、単語以外の位置にある場合は、次の単語の末尾に移動します)。
b
現在カーソルがある単語の先頭に移動します (カーソルが単語の先頭にある場合や、単語以外の位置にある場合は、1 つ前の単語の先頭に移動します)。
Ctrl-f
次のページにスクロールします。
Ctrl-b
前のページにスクロールします。

上記のコマンドのいずれにしても、コマンドの前に数字を入力すると、その数字の回数だけコマンドが実行されます。この回数は、繰り返しカウント、または単にカウントと呼ばれます。例えば 5h と入力すると、5 文字左に移動します。繰り返しカウントは多くの vi コマンドで使用することができます。

行への移動

ファイル内の特定の行にカーソルを移動するには、以下のコマンドが役立ちます。

G
ファイル内の特定の行に移動します。例えば 3G とすると、3 行目に移動します。パラメーターを指定しないで G を実行すると、ファイルの最終行に移動します。
H
画面上の先頭行に移動します。例えば 3H は、画面上の先頭行から 3 番目の行に移動します。
L
H が画面上の先頭行を基準にしていたのに対し、L は画面上の最終行を基準に移動します。したがって 2L は、画面上の最終行から 2 番目の行に移動することになります。

ファイル内を自由に移動できるようになるまで、これらのコマンドを練習してください。カーソルが思った通りに動かなくなり、どうにもならない場合には、この先を読むとファイルから抜け出す方法を学べます。

vi の終了

新しいエディターについて学ぶときに最も役立つ知識の 1 つは、例えば重要な構成ファイルを壊してしまうといったような、してはいけないことをする前に、エディターを終了する方法です。vi を終了するときには、変更を保存することも破棄することも、あるいは最初からやり直すこともできます。以下に記載するコマンドが機能しないようであれば、挿入モードになっている可能性があります。このモードについては後で説明しますが、どのモードになっているか確かでない場合には、Esc を押すと挿入モードが終了してコマンド・モードに戻るので、コマンドが機能するようになるはずです。

:q!
ファイルの編集を終了し、すべての変更を破棄します。問題から抜け出るには、このコマンドが最も一般的な方法です。
:w!
これはファイルが変更されているかどうかに関わらずファイルに書き込みを行うコマンドで、既存のファイルや読み取り専用のファイル、またはその他の書き込み不可能なファイルの上書きを試行します。ファイル名をパラメーターとして指定すると、書き込み操作は開いているファイルではなく、指定したファイルに対して行われます。通常は、自分が何をしているのか自覚していない限り、「!」は省いたほうが安全です。
ZZ
ファイルが変更されている場合、ファイルの書き込みを行ってから終了します。通常の vi の終了方法としては、このコマンドが最も一般的です。
:e!
現在開いているファイルの編集をやり直します。これによってファイルのリロードが行われ、ファイルでこれまでに行った変更内容は破棄されます。このコマンドは、保存されているファイルが何らかの理由で変更されたために最新のバージョンを開く必要がある場合にも使用できます。
:!
シェル・コマンドを実行します。コマンドを入力して Enter を押してください。コマンドの実行が完了すると、出力が表示され、vi 編集に戻るようにプロンプトが表示されます。

注:

  1. コロン (:) を入力すると、カーソルが画面の一番下にある、コマンドやパラメーターを入力できる行に移動します。
  2. 上記のコマンドの感嘆符 (!) を省略すると、変更が保存されていないというエラー・メッセージや、ファイルに書き込むことができないというエラー・メッセージ (例えば読み取り専用ファイルを編集している場合など) を受け取ることがあります。
  3. : コマンドには正式なフォーム (:quit、:write、:edit) がありますが、これらのフォームが使われることはほとんどありません。

vi のモード

vi エディターには以下の 2 つの操作モードがあります。

コマンド・モード
コマンド・モードでは、ファイル内を移動して、テキストの検索、テキストの削除、テキストの変更などの編集操作を行います。vi を起動すると、通常はコマンド・モードになっています。
挿入モード
挿入モードでは、ファイル内の該当する挿入箇所に新しいテキストを入力します。コマンド・モードに戻るには Esc (Escape) キーを押します。

この 2 つのモードのそれぞれによって、エディターの動作方法が変わってきます。挿入モードで入力した内容はすべて、ファイルに挿入されるテキストだと見なされます。コマンドを入力しようとしているのに何も起こらない場合、または文字がカーソルの下に現れる場合には、Esc キーを押し忘れて挿入モードのままになっている可能性があります。


テキストの編集

vi でファイルを開いてファイル内を移動する方法、vi を終了する方法がわかったので、今度はファイルでテキストを編集する方法を説明します。

テキストの変更

以下は、テキストの挿入、削除、または変更が必要なときに使用するコマンドです。これらのコマンドの一部には、小文字のコマンドと似たような操作を行う大文字のコマンドがあります。以下の説明を読んでください。

i
挿入モードに移り、現在カーソルが置かれている文字の前に挿入します。テキストを入力して Esc キーを押すと、コマンド・モードに戻ります。現在カーソルが置かれている行の先頭に挿入するには I を使用します。
a
挿入モードに移り、現在カーソルが置かれている文字の後に挿入します。テキストを入力して Esc キーを押すと、コマンド・モードに戻ります。現在カーソルが置かれている行の末尾に挿入するには A を使用します。
c
c コマンドを使用すると、挿入モードに移り、現在カーソルが置かれている文字を、入力した文字で置換することができます。
o
テキストを挿入する新しい行を現在カーソルが置かれている行の下に開きます。現在の行の上に行を開くには、O を使用します。
cw
現在カーソルが置かれている位置から単語の末尾までを削除し、挿入モードに移って置換します。繰り返しカウントを使用することで、複数の単語を置換することができます。行の末尾まで削除して置換するには、c$ を使用します。
dw
上記のcw (および c$) と同じですが、挿入モードには移りません。
dd
現在カーソルが置かれている行を削除します。繰り返しカウントを使用することで、複数の行を削除することができます。
x
カーソルが置かれている文字を削除します。繰り返しカウントを使用することで、複数の文字を削除することができます。
p
最後に削除したテキストを現在カーソルが置かれている文字の後に貼り付けます。現在の文字の前に貼り付けるには P を使用します。
xp
x と p の組み合わせは便利な慣用法です。この組み合わせは、カーソルが置かれている文字と、その右側にある文字を入れ替えます。

テキストの検索

正規表現を使用して、ファイル内のテキストを検索することができます。

/
ファイル内で順方向に検索するには、/ の後に正規表現を続けます。
?
ファイル内で逆方向に検索するには、? の後に正規表現を続けます。
n
n を使用すると、最後の検索を順方向または逆方向で繰り返します。

上記の検索コマンドの場合はいずれも、コマンドの前に繰り返しカウントを表す数字を付けることができます。したがって、/x の後に 2n を実行する代わりに、3/x を使用すれば、現在のカーソル位置から 3 番目に出現する x を検索することができます。同様に、2/^e とすると、現在のカーソル位置から 2 番目にある e で始まる行を検索します。

検索は、ファイルの終わりに達すると、ファイルの先頭に戻ることに注意してください。

ヘルプの表示

vi で役立つコマンドには、ヘルプ・コマンドもあります。:help と入力すると、このコマンドが呼び出されます。ヘルプは vi の内部で開くので、ヘルプを終了して作業に戻るには :q コマンドを使用します。特定のトピックに関するヘルプを表示するには、:help の後に該当する単語を続けてみてください。例えば行の折り返しに関するヘルプを表示する場合は、:help  wrap と入力します。

まとめ

記事の初めでは、count1.sh ファイルに行を追加する必要があるという設定になっていました。元のファイルを保持し、変更後のファイルに count2.sh という名前を付けて保存するには、このファイルを vi で開いた後、以下の vi コマンドを使用することができます。注意する点として、ここでの <Esc> は、Esc キーを押すことを意味します。

リスト 3. count1.sh に行を追加するためのエディター・コマンド
1GOsleep 20<Esc> :w! count2.sh :q

これらのコマンドが実行する内容は以下のとおりです。

1G
ファイルの先頭行に移動します。
O
移動した行の上に新しい行を開き、挿入モードに移ります。
sleep 20
これが、追加する新しいテキストです。
<Esc>
Esc キーを押してコマンド・モードに戻ります。
:w! count2.sh
変更後のファイルをディスクに書き込みます。
:q
vi を閉じます。

以上のとおり、方法がわかれば簡単なことです。

101 試験の主題 103: GNU および UNIX コマンドに関する記事は、今回が最後です。連載の他の記事についての説明とリンクについては、連載のロードマップを参照してください。

参考文献

学ぶために

製品や技術を入手するために

  • developerWorks から直接ダウンロードできる IBM ソフトウェアの試用版を使用して、Linux で次の開発プロジェクトを構築してください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=473503
ArticleTitle=Linux の 101 試験対策: vi によるファイルの編集
publish-date=02102010