Jump to content 日本-日本語

製品  >  ソフトウェア  >  HP-UX   >  Knowledge-on-Demand  >  UNIXの教科書 応用編

UNIXの教科書 応用編
〜はじめよう! WindowsとLinuxからのステップアップ〜

第3日目:viエディタの操作(活用編)

HP-UX/Integrityサーバー お問い合せ
コンテンツに進む
第3日目:viエディタの操作(活用編)
UNIXの教科書 応用編〜はじめよう! WindowsとLinuxからのステップアップ〜 3日目
viをより便利に使う
exコマンドに挑戦

2時間目:exコマンドに挑戦

基礎編でも説明したように、viエディタの前身はラインエディタ「ex」です。たとえばviを終了するのに使用した「:q」や「:wq」のようにコロン「:」で始まるコマンドはexコマンドでした。exコマンドを使いこなせるようになると、よりきめ細やかな編集が可能になります。exコマンドは多岐にわたりますが、ここではviでファイルの編集をしていく上で特に便利な、置換を行う「s」コマンドと、削除を行う「d」コマンドを中心に解説しましょう。

現在行の文字列を置き換える

exコマンドの中でもっとも頻繁に使用するコマンドが、文字列を置換する「s」コマンドです。これを使って、現在行の文字列を置き換えるには次の書式で実行します。

:s/置換対象の文字列/置換後の文字列/

たとえば、現在行の文字列「hp」を「HP」に置き換えるにはつぎのようにします。

hp-ux hp1 hp unix hp2
    ↓ 「:s/hp/HP/」コマンドを実行【Enter】
HP-ux hp1 hp unix hp2


四色君:
これだと、カーソルの位置にかかわらず最初に見つかった文字列のみが置換されますね。
四色君
マリー先生
マリー先生:
そうね、デフォルトでは行の頭から検索していって最初に見つかった文字列だけが置換されるの。最後に「g」を指定して「:s/hp/HP/g」とすると、見つかったすべての文字列が置換されるわ。

HP-ux hp1 hp unix hp2
    ↓ 「:s/hp/HP/g」コマンドを実行【Enter】
HP-ux HP1 HP unix HP2
タックス君:
スラッシュ「/」を置換することはできますか?
タックス君
マリー先生
マリー先生:
スラッシュ「/」はそのままでは置換対象の文字列と置換後の文字列との区切りの記号として使われるの。「/」を文字として扱いたければ、前に逆スラッシュ「\」を付けてエスケープすればいいわ。たとえば、現在行のスラッシュ「/」をすべてコロン「:」に置換するには次のようにするの。この場合も最後に「g」を付けることを忘れないでね。

Sample1/Work/15
    ↓ 「:s/\//:/g」コマンドを実行【Enter】
Sample1:Work:15

ファイル内にあるすべての文字列を置き換える

「s」コマンドはデフォルトでは現在行を対象としますが、その前に行の範囲を指定することで、その範囲を置換対象とすることが可能です。もっとも頻繁に使用する範囲を表す記号が「%」です。「%」はファイル全体を表します。したがって、ファイル全体にわたって「hp」を「HP」に置換するには次のようにします。

hp-ux hp-ux hp unix
hp-ux unix hp
hp-ux hp unix
    ↓ 「:%s/hp/HP/g」コマンドを実行【Enter】
HP-ux HP-ux HP unix
HP-ux unix HP
HP-ux HP unix


タックス君:
この場合も最後に「g」が必要ですか?
タックス君
マリー先生
マリー先生:
そうね。「g」を付けないと、各行の最初に見つかった文字列しか置換されないわ。

hp-ux hp-ux hp unix
hp-ux unix hp
hp-ux hp unix
    ↓ 「:%s/hp/HP/」コマンドを実行【Enter】
HP-ux hp-ux hp unix
HP-ux unix hp
HP-ux hp unix

四色君:
置換するかどうかを、ひとつずつ確認しながら決めることはできますか?
四色君
マリー先生
マリー先生:
最後に「c」を追加して「:%s/hp/HP/gc」とすればできるわよ。そうすると、見つかった文字列ごとに画面の下に次のように表示されるの。

2 hp-UX
  ^^

続けて「y」をタイプすれば置換、それ以外の文字では置換されなくなるわ。

行番号を指定して範囲を指定する

範囲の行番号を、次のように開始行と終了行をカンマ「,」で区切って指定することもできます。

開始行,終了行

終了行を省略した場合には開始行のみが対象になります。たとえば、「2s/hp/HP/g」とした場合2行目が対象となり、「2,4s/hp/HP/g」とすれば2行目から4行目が対象となって、文字列「hp」が「HP」に置換されます。

タックス君:
たとえば、現在行からファイルの最後までを対象にしたい場合には、あらかじめ行番号を調べる必要があるのですか?
タックス君
マリー先生
マリー先生:
もっと簡単な方法があるわ。exでは、現在行をピリオド「.」、ファイルの最後を「$」で表記できるの。



したがって、現在行からファイルの最後までを対象に「hp」を「HP」に置換するには、「:.,$s/hp/HP/g」を実行すればいいの。

hp-ux hp-ux hp unix
hp-ux unix hp
hp-ux hp-ux hp unix	←現在行
hp-ux unix hp
hp-ux hp unix
hp-ux hp unix
    ↓ 「:.,$s/hp/HP/g」コマンドを実行【Enter】
hp-ux hp-ux hp unix
hp-ux unix hp
HP-ux HP-ux HP unix
HP-ux unix HP
HP-ux HP unix
HP-ux HP unix

また、ファイルの最初から現在行までを対象にしたければ、範囲を次のように指定すればいいわけ。


正規表現を使用した置換対象行の指定

置換対象となる範囲を次のような形式で指定すると、正規表現のパターンに一致する行を対象に置換が行われます。

g/正規表現/

たとえば、行頭が「NG」で始まる行を対象に文字列「AA」を「xx」に変換するには、範囲を「g/^NG/」のように指定して「:g/^NG/s/AA/xx/g」を実行します。

OK:AA:12
NG:AA:01
OK:AA:01	
NG:AA:01
NG:AA:01
    ↓ 「:g/^NG/s/AA/xx/g」コマンドを実行【Enter】
OK:AA:12
NG:xx:01
OK:AA:01
NG:xx:01
NG:xx:01

なお、行番号の代わりに「/正規表現/」で行を指定することもできます。たとえば、1行目から行頭が「30」で始まる行までを対象として文字列「hp」を「HP」に置換するには、範囲を「1,/^30/」のように指定して「:1,/^30/s/hp/HP/g」のようにします。

10	hp
20	hp
30	hp
40	hp
50	hp
    ↓ 「:1,/^30/s/hp/HP/g」コマンドを実行【Enter】
10      HP
20      HP
30     HP
40      hp
50      hp

行の削除

続いてもうひとつ、便利なexコマンドとして行を削除する「d」コマンドを紹介しましょう。「s」コマンドと同じように前に範囲を指定できます。

範囲d

たとえば、3行目から4行目までを削除するには「:3,4d」、現在行から行末までを削除するには「:.,$d」を実行します。
もちろん、「s」コマンドと同じく「g/正規表現/」を使って正規表現のパターンに一致する行を削除することもできます。たとえば、「:g/^[0-9]/d」とすると行頭が数字で始まる行が削除されます。

1 hp-ux
unix
3 hp-ux
4 hp
unix
    ↓ 「:g/^[0-9]/d」コマンドを実行【Enter】
unix
unix

タックス君:
行の削除はviの「dd」や「d」コマンドでもできますよね。
タックス君
マリー先生
マリー先生:
そう、exコマンドの「:.,$d」は、viのコマンドでは「dG」ね。ただ、範囲の開始行と終了行を指定したり、正規表現のパターンにマッチする行のみを削除したりといった場合は、exコマンドを使う必要があるわね。

それから、範囲の指定はファイルの書き込みを行う「w」コマンドでも使えるのよ。
タックス君:
指定した範囲だけをファイルに書き込めるということですか?
タックス君
マリー先生
マリー先生:
そう。たとえば「:3,$w test.txt」では3行目からファイルの最後までをファイル「test.txt」に書き込むの。s


練習問題

第1問:現在行の行末に向かって文字「f」を検索し、最初に見つかった文字「f」にカーソルを移動するコマンドはどれか?

a) sf
b) f
c) ff
d) xf
正解はこちら
c) ff
現在行の後方に向かって文字を検索するには「f<文字>」コマンドを実行する。

第2問:現在行から3行をバッファに格納するコマンドはどれか?

a) 3yy
b) yy3
c) 3y
d) y3s
正解はこちら
a) 3yy
「<数値>yy」で指定した行数をバッファに格納する。

第3問:2行目から現在行までの範囲で、文字列「hp」をすべて「HP」に置換するコマンドはどれか?

a) :2,$s/hp/HP/g
b) :2,.s/hp/HP/g
c)

:2,.s/hp/HP/

d) :1,.s/hp/HP/
正解はこちら
b) :2,.s/hp/HP/g
現在行はピリオド「.」で表せる。また、すべての文字列を置換するには最後に「g」が必要となる。

第4問:空行をすべて削除するコマンドはどれか?

a) :g/^[[:space:]]*$/d
b) :/^[[:space:]]*$/d
c) :g%d
d) :g/^ *$/d
正解はこちら
a) :g/^[[:space:]]*$/d
「/正規表現/」で行の指定ができる。したがって、正規表現のパターンに一致する行を削除するには「:g/正規表現/d」コマンドを実行すればよい。空行を表すパターンは「/^[[:space:]]*$」である。

連載記事一覧 戻る 1  |  2

教科書シリーズ 「UNIXの教科書」 「HAクラスターの教科書」 連載記事一覧

UNIXの教科書「基礎編」

第1日目:ログインしてコマンドを実行してみる
第2日目:ディレクトリやファイルを操作してみる
第3日目:シェルの基本を知る
第4日目:ファイルの基本操作
第5日目:viエディタの操作(基本編)
第6日目:リダイレクションとパイプを活用する
期末試験

UNIXの教科書「応用編」

第1日目:grepコマンドと正規表現
第2日目:ファイルの検索
第3日目:viエディタの操作(活用編)
第4日目:ファイルの圧縮とアーカイブ
第5日目:ジョブとプロセスの操作
第6日目:シェルの環境設定
第7日目:シェルスクリプトでより便利に
期末試験

UNIXの教科書「運用編」

第1日目:ユーザーの管理
第2日目:ファイルの安全管理(その1)
第3日目:ファイルの安全管理(その2)
第4日目:ネットワークの基本を理解する
第5日目:ネットワーク関連のコマンド
第6日目:システム情報の表示
期末試験 New!

HAクラスターの教科書

第1日目:ハードウェア構成を知る
第2日目:ネットワークを設定する
第3日目:共有ディスクを構成する
第4日目:HAクラスターを構成する
第5日目:パッケージを構成する
第6日目:障害テストを実施する
期末試験

 その他の連載記事


本ページの内容は執筆時の情報に基づいており、異なる場合があります。

お問い合わせ

ご購入前のお問い合わせ


ご購入後のお問い合わせ

HPEサポートセンター
製品の標準保証でご利用いただける無償のサービスです。

ショールーム

ショールーム 導入をご検討のお客様へ
業務アプリケーションの継続・標準化・開発性とシステム担当者様、システム開発者様が抱える悩み・疑問に対する解決策実体験して頂けます。
印刷用画面へ
プライバシー ご利用条件・免責事項