Linux標準教科書 第6章(v304対応)
vi エディタ
6.1 vi の基本操作
vi はページャであり、エディタでもあります。 vi でファイルを開いた場合コマンドモードといって、ページングによる行やページ単位の移動や、行の削除、コピー、カット、ペーストなどの編集作業を行う事ができるモードと文字入力を受け付けるインサートモードがあります。この2つのモードを使い分けながら操作します。
6.1.1 ファイルを開く
書式 vi [ファイル名]
6.1.2 ファイルを閉じる
vi コマンドを使って開いたファイルを閉じるには、「ESC」キーを押した後、 : (コロン)q と入力します。
実習: vi によるファイルの開閉
1 まずは既存のファイルを開いて見ます。
$ vi /etc/hosts
2 ファイルが開きました。
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
~
~
~
~
~
~
“/etc/hosts” [読込専用] 2L, 158C 1,1 全て
3 ESCを押して :q コマンドを実行してファイルを閉じます。
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
~
~
~
~
~
:q
4. vi コマンドが終了して、コマンド入力待機状態に戻ります。
6.1.3 ファイルを保存する
vi コマンドを使って開いたファイルを保存するには「ESC」キーを押した後、 :w と入力します。ファイルに変更内容が書き込まれて、編集作業を継続出来ます。
$ vi test.txt
~
~
~
:w
↓
~
~
~
“test.txt” 5L, 7C 書込み 5,0-1 全て
6.1.4 ファイルを保存して終了する
vi コマンドを使って開いたファイルを保存した後ファイルを閉じるには「ESC」キーを押した後、 :wq と入力します。ファイルを閉じて終了して見ましょう。
$ vi test.txt
↓
~
:wq
↓
$ vi test.txt
6.1.5 ファイルを保存せずに強制的に閉じる
vi コマンドを使って開いたファイルを保存せずに閉じるには、「ESC」キーを押した後、 :q! と入力します。通常、編集済みのファイルはそのままでは閉じる事は出来ません。
$ vi test.txt
↓
~
:q!
$ vi test.txt
補足: vi のみでファイル名を付けないでコマンドを押した時もファイルが開きます。名前を入れて保存したい時は下記のように入力して下さい。ファイル名は Linux としました。
$ vi
~
:wq Linux
$ ls -l Linux
-rw-rw-r– 1 vagrant vagrant 0 12月 16 12:18 Linux
実習: vi によるファイルの操作
1 以下のコマンドを実行します。
$ vi editfile.txt
2 内容が空のファイルが開きます。
~
~
~
~
~
~
~
“editfile” [新ファイル] 0,0-1 全て
3 「 i 」キーを押して「インサート」モードに切り替えます。
~
~
~
~
~
— INSERT —
4 キーボードで「Apple」と入力しましょう。
Apple
~
~
~
~
~
~
— 挿入 — 1,1 全て
5 「ESC」キーを押して「インサート」モードから抜けます。
6 :w コマンドを実行してファイルを保存します。
Apple
~
~
~
~
~
~
:w
7 ファイルが保存され「書き込み」と表示されます。
~
~
“editfile.txt” 1L, 6C 書込み 1,1 全て
8 「コマンド」モードで 「A」キーを押して行末まで移動して「 Enter 」キーを押して改行します。
9 次の行に「 Orange」と入力しましょう。
Apple
Orange
~
~
~
~
~
10 「ESC」キーを押して「インサート」モードから抜けます。
11 :q コマンドを実行して、ファイルを閉じて見ます。
12 変更した内容が保存されていないため、エラーが表示されます。
E37: 最後の変更が保存されていません (! を追加で変更を破棄) 2,6 全て
13 :wq コマンドを実行すると、ファイルが閉じる事ができるのを確認します。
14 もう一度ファイル editfile.txt を開きます。
15 「コマンド」モードで「 A 」キーを押して行末まで移動し「 Enter 」キーを押して改行します。
16 次の行に「 Banana 」と入力しましょう。
17 「ESC」キーを押して「インサート」モードから抜けます。
18 :q! コマンドを実行すると、ファイルが閉じる事ができるのを確認します。
Apple
Orange
Banana
~
~
~
~
~
~
~
~
:q!
17 ファイルを開き、「 Bnana 」という文字列がファイルに書かれていないことを確認します。
Apple
Orange
~
~
6.2 「インサートモード」と「コマンドモード」
vi エディタを起動すると、コマンドを入力するコマンドモードでファイルが開かれます。文字列を打ち込むには i コマンドまたは a コマンドでインサート(挿入)モードへ切り替えます。
6.2.1 テキストの入力
実習: テキストの入力
viinsert.txt を新規作成してみます。
$ vi insert.txt
文字列を入力するにはインサートモードへ移行します。カーソルがある位置(文字の前)にテキストを入力するには i コマンド( insert コマンド)を使います。
1 まず、インサートモードに切り替えるため、 i コマンドを入力します。
2 画面左下に挿入と表示されます。
~
— 挿入 — 0,1 全て
3 文字を入力します。
text
~
~
インサートモードではカーソルがある位置にテキストを挿入しましたが、カーソルのある文字の後にテキストを入力するモードもあります。入力モードから抜けるには「ESC」キーを入力して下さい。
1 まず、インサートモードに切り替えるため、a コマンドを入力します。
2 画面左下に挿入と表示されます。
~
— 挿入 — 0,1 全て
3 文字を入力します。
textTEST
~
カーソルの位置ではなく、行の先頭にテキストを入力するには I コマンドを使います。入力モードから抜けるには「ESC」キーを入力して下さい。
1 まず、インサートモードに切り替えるため、 I コマンドを入力します。
2 画面左下に挿入と表示されます。
~
— 挿入 — 0,1 全て
3 文字を入力します。
1234textTEST
~
行の最後にテキストを入力するには A コマンドを使います。
1 インサートモードに切り替えるため、 A コマンドを入力します。
2 画面左下に挿入と表示されます。
~
— 挿入 — 0,1 全て
3 文字を入力します。
1234textTEST5678
~
文字を間違えた時は「Delete」や「BS」でカーソル前の1文字が削除出来ます。ファイルを変更したので、 :wq コマンドで保存して終了して下さい。
~
:wq
コマンドモードまとめ
「 i 」 インサートモード
「 a 」 カーソルの後ろからスタート
「 I 」 行の先頭に行く(スタート)
「 A 」 行の末尾に行く(スタート)
6.2.2 カーソルの移動
$ vi vimove.txt
次の文字を入力して下さい。
Apple
Orange
Bnana
Melon
~
CentOS7で利用できる vi コマンドはカーソルが使えます。
「 h 」・・左へ移動 「 l 」・・右へ移動 「 j 」・・下へ移動 「 k 」・・上へ移動
「 0 ゼロ 」・・カレント行の先頭へ移動 「 $ 」・・カレント行の行末へ移動
6.3 編集中の大きな移動
6.3.1 ページ単位の移動
実習: ページ単位の移動
実習が終わったら編集内容を保存せずに終了します。
$ vi /var/log/dmesg
次のページの移動は「 Ctrl + f 」 コマンドです。前のページ移動は「 Ctrl + b」 コマンドです。
行数を出すと見やすいので :set nu コマンドを実行します。
364 [ 1.252514] ata1: PATA max UDMA/33 cmd 0x1f0 ctl 0x3f6 bmdma 0xd000 irq 14
365 [ 1.252516] ata2: PATA max UDMA/33 cmd 0x170 ctl 0x376 bmdma 0xd008 irq 15
366 [ 1.252609] ahci 0000:00:0d.0: version 3.0
367 [ 1.253135] ahci: SSS flag set, parallel bus scan disabled
:q! コマンドで vi を終了して下さい。
6.3.2 行を指定した移動
実習: 行の移動
$ vi /var/log/dmesg
:set nu で行番号をつけます。
108 [ 0.000000] Console: colour VGA+ 80×25
109 [ 0.000000] console [tty0] enabled
110 [ 0.000000] allocated 4194304 bytes of page_cgroup
111 [ 0.000000] please try ‘cgroup_disable=memory’ option if you don’t want memory cgroups
112 [ 0.000000] tsc: Fast TSC calibration using PIT
113 [ 0.001000] tsc: Detected 2700.013 MHz processor
:set nu 100,1 21%
100行目へ移動したい場合は、「:100」と入力してください。10 行目へカーソルが 移動します。
「:1」と入力すると 1 行目へ戻ります。また、カーソルが有効な時「gg」コマンドで先頭行へ移動。「G」(大文字)で最終行へ移動します。
97 [ 0.000000] PID hash table entries: 4096 (order: 3, 32768 bytes)
98 [ 0.000000] xsave: enabled xstate_bv 0x7, cntxt size 0x340
99 [ 0.000000] Checking aperture…
100 [ 0.000000] No AGP bridge found
101 [ 0.000000] Memory: 999048k/1048512k available (6244k kernel code, 392k absent, 49072k reserv
:1 で1行目に戻ります。 :q! で終了して下さい。
:1
6.4 様々な編集操作
6.4.1 文字のカット・アンド・ペースト
文字のカット・アンド・ペーストの機能はコマンドモードで実行します。
実習: 文字のカット・アンド・ペースト
vi コマンドで vicutpaste.txt ファイルを作成しサンプル文字列を入力して下さい。
$ vi vicutpaste.txt
This is aa pen.
That is na apple.
上記例文は誤りがあります。これを正しい文に修正しましょう。
1 まずコマンドモードにしてカーソルを aa の位置に移動します。
2 x コマンドで aa の a を1文字削除して下さい。
This is a pen.
That is na apple.
文字の削除に利用した x コマンドは、x コマンドで削除した最後の文字はバッファと呼ばれる一時的な箱に入ります。そのため、p コマンドを実行するとバッファに保存された文字を取り出すことが出来ます。
次に2列目の文を修正しましょう。
1 まずコマンドモードにしてカーソルを na の n の位置に移動します。
2 x コマンドで na の n を1文字削除して下さい。
This is a pen.
That is a apple.
3 x コマンドで n が削除されました。
p コマンドはカーソルがある文字の後に文字をペーストします。カーソルの前に文字をペーストしたい時は P コマンドを使います。
4 二文字カットしたい場合カーソルに文字を当てて 2x
This is is a pen.
This is a pen.
6.4.2 行のカット・アンド・ペースト
実習: 行のカット・アンド・ペースト
行単位でカットしたい場合は dd コマンドを使います。カットした行のテキストはバッファへ入るため、p コマンドまたは P コマンドを実行すると文字列をペーストできます。
「 This is a pen.」を dd コマンドで一行カットした後、 p コマンドと P コマンドを実行して違いを確認してみましょう。実習が終わったら、:wq! コマンドでファイルを保存して閉じて下さい。
p コマンド
That is an apple.
This is a pen.
P コマンド
6.4.3 行のコピー・アンド・ペースト
実習: 行のコピー・アンド・ペースト
2行目をコピーしたいとおもいます。2行目にカーソル移動して yy コマンドでコピー。コピーした内容は p コマンドでペーストして下さい。
This is a pen.
That is an apple.
This is a pen.
That is an apple.
That is an apple.
2行をコピーしたい場合は gg コマンドを入力して文書頭まで戻って 2yy とコマンドを実行して下さい。その後 p コマンドでペーストして下さい。:wq! コマンドで終了して下さい。
This is a pen.
That is an apple.
That is an apple.
This is a pen.
This is a pen.
That is an apple.
That is an apple.
That is an apple.
6.4.4 編集の取り消し(アンドゥ)
実習: 文字編集の取り消し
This is a pen.
1 x コマンドで、文字列を全部削除して下さい。
2 u コマンドで、削除した文字列が一文字ずつ挿入されるのを確認します。
3 :q! コマンドでファイルを閉じます。
4 もう一度、ファイルを開いて下さい。
5 yy コマンドを押して、行をコピーして下さい。
6 p コマンドで、「 This is a pen. 」をペーストできることを確認します。
7 u コマンドで、ペーストした文字列が削除されるのを確認します。
8 終わったら :wq! コマンドでファイルを保存して閉じて下さい。
6.5 置換と検索
巨大であったり、全体像を把握していないファイルはカーソル移動やページ移動のコマンドだけでを駆使して目的の位置へたどりつくのは大変です。テキストファイルの中にある文字列を検索するコマンドを使うと、素早く目的の位置に移動できます。また、置換コマンドを使えば文章中の文字列を探して別の文字列に置き換えることも素早く行うことができます。
6.5.1 文字列の検索
実習: 文字列の検索
vi コマンドで /var/log/dmesg ファイルを開き特定の文字列を検索してみましょう。文字列を検索するコマンドは / です。/ コマンドの後ろに探したい文字列を入力し、「 Enter 」キーを入力するとカーソルが文字列へ移動します。 n コマンド(下に行く)または N コマンド(上に行く)で繰り返し探せます。
$ vi /var/log/dmesg
[ 0.000000] DMI: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
[ 0.000000] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
/
文字列を検索すると検索した文字がハイライト表示されます。ハイライトを消すには :nohlsearch コマンドを実行して下さい。
終了は :q! コマンドで vi を終了して下さい。
[ 0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x7010600070106
[ 0.000000] CPU MTRRs all blank – virtualized system.
[ 0.000000] found SMP MP-table at [mem 0x0009fff0-0x0009ffff] mapped at [ffff88000009fff0]
/CPU
6.5.2 文字列の置換え
:対象の行s/検索文字列/置換え文字列/オプション
対象の行を省略すると現在カーソルがある行だけが置換対象になります。オプションに g を指定すると1行にある複数の検索文字列を置換します。( g を指定しないと行ごとに1回だけ置換します)
実習: 文字列の置換
vi コマンドで vireplace.txt を用意して下さい。
$ vi vireplace.txt
lemon orange banana melon lemon
orange banana melon lemon orange
banana melon lemon orange banana
melon lemon orange banana melon
lemon orange banana melon lemon
orange banana melon lemon orange
banana melon lemon orange banana
melon lemon orange banana melon
1 1行目の banana をBANANA に置換してみましょう。
:1s/banana/BANANA/g
2 結果は以下のようになったはずです。
lemon orange BANANA melon lemon
3 次に、 orange を ORANGE に置換してみましょう。
:1s/orange/ORANGE/
4 結果は以下のようになったはずです。
lemon ORANGE BANANA melon lemon
次に g オプションありと g オプションなしの時の動作の違いを確認してみましょう。
1 2行目の orange を ORANge に置換してみましょう。
:2s/orange/ORANGE/g
2 結果は以下のようになったはずです。
ORANGE banana melon lemon ORANGE
g オプションつけた場合、指定した行にある全ての文字列を別の文字列に置換します。
3 3行目の banana を BANANA に置換してみましょう。
:3s/banana/BANANA/
4 結果は以下のようになったはずです。
BANANA melon lemon orange banana
g オプションを付けなかった場合、指定した行にある最初の該当文字列のみ、別の文字列に置換して終了します。
ファイル全体の文字列置換
ファイル全体を置換対象とする場合は、 %s/old/new/g のように記述します。
1 ファイル全体の melon を MELON に置換してみましょう。
:%s/melon/MELON/g
2 結果は次のようになったはずです。
lemon orange BANANA MELON lemon
ORANGE banana MELON lemon ORANGE
BANANA MELON lemon orange banana
MELON lemon orange banana MELON
lemon orange banana MELON lemon
orange banana MELON lemon orange
banana MELON lemon orange banana
MELON lemon orange banana MELON
確認しながらファイル全体を文字列置換
次に gc オプション付きで、確認しながら文字列置換してみましょう。
1 ファイル全体の lemon を @LEMON@ に置換してみましょう。
:%s/lemon/@LEMON@/gc
2 実行すると確認メッセージが出てきます。この時点では置換されません。
lemon orange BANANA MELON lemon
ORANGE banana MELON lemon ORANGE
BANANA MELON lemon orange banana
MELON lemon orange banana MELON
lemon orange banana MELON lemon
orange banana MELON lemon orange
banana MELON lemon orange banana
MELON lemon orange banana MELON
@LEMON@ に置換しますか? (y/n/a/q/l/^E/^Y) 1,1 全て
3 y と入力すると置換が実行され、次の lemon を @LEMON@ に置換するか確認メッセージが出ます。
@LEMON@ に置換しますか? (y/n/a/q/l/^E/^Y) 1,1 全て
y を入力すると文字列置換して、n を入力すると文字列を置換しません。該当文字列が見つからなくなるまで、確認メッセージが出ます。 q を入力すると、文字列置換を中止できます。
6.6 章末テスト
vi を使用中の場合に、以下を実現するためのコマンドを答えなさい。
(1)カレントから3行をコピーする
(2)文書内の abc という語句を検索する。
(3)編集中のファイルを保存せずに強制終了する。
(4)文書の 100行目に移動する
(5)文書中の「高野豆腐」を「絹ごし豆腐」に置換する。ただし g オプションを付けて実行する。
テキストと問題集の購入は下記の画像をクリックして下さい。
章末テスト解答
(1)3yy
(2)/abc
(3):q!
(4):100
(5)%s/高野豆腐/絹ごし豆腐/g