AIX初心者：vi editor操作 Tips

#はじめに
AIX上でシェル・スクリプトとかを書くときに、viやemacsなど、いくつかeditorが提供されていますが、自分はviを良く利用します。
似たようなことをまとめている人が多数ですが、AIXをこれから触っていく人向けへのTipsとして、自身の備忘録も兼ねて、以下にviの操作方法をまとめておきます。
#起動
|作法|意味|
|:---|:---|
|vi　ファイル名　　|編集対象のファイルを開く（複数ファイルも可）|
|vi　+n　ファイル名|n 行目から表示する|
|vi　+/文字列　ファイル名|文字列が存在する行から表示する|

#入力・編集　
※コマンドモードでここのコマンドを入力すると入力モードになります

|作法|意味|
|:---|:---|
|a|カーソルの右から入力開始|	
|A|行末から入力開始|	
|i|カーソルの左から入力開始|	
|I|行の頭から入力開始|
|o|現在の行の下に１行挿入し、その行頭から入力開始|
|O|現在の行の上に１行挿入し、その行頭から入力開始|　	
|J|次の行と現在の行とを結合する|	
|nJ|下のn行を現在の行とを結合する|

#削除
|作法|意味|例|
|:---|:---|:---|
|x|カーソル上の１文字削除|	
|X|カーソルの左の文字を１文字削除|	
|dd|現在の行を削除|	
|ndd|n 行、削除	|
|dw|カーソル上の一単語を削除	|
|df 字|カーソル位置から指定した字 までを削除	|*1|
|d$|カーソル位置から行の最後までを削除|
|d^|カーソル位置から行の先頭までを削除|
|:行1, 行2　d|行1 から行2 を削除|	


#置換
|作法|意味|例|
|:---|:---|:---|
|r|カーソル上の１文字を他の１文字に置換|
|s|カーソルのある１文字を他の文字列で置換|*2|
|S|現在の行を他の文字列で置換|
|cw|カーソル位置からその単語の最後までを置換|
|cf 字|カーソル位置から指定した字 までを置換|*3|
|C|カーソル位置から行の最後までを置換|
|:%s/置換え前/置換え後|置換え前の文字列を、置換え後の文字列で置換(各行で最も近くにある文字列一つに対してのみ実行|
|:%s/置換え前/置換え後/g|ファイルの中すべての文字列に対して、置換えを行う|
|~（チルダ）|大文字/小文字を変更|

#検索
|作法|意味|
|:---|:---|
|/<文字列>|文字列 を検索する	
|?<文字列>|文字列を検索する（逆方向）	
|n|	順方向へ検索する	
|N|	逆方向へ検索する	

#Cut&Paste
|作法|意味|
|:---|:---|
|yy|現在の行をバッファにコピー	
|nyy|n 行分をバッファにコピー	
|yw|単語をバッファにコピー	
|p|バッファ内のテキストを挿入※（文字、単語はカーソルの右に、行は現在の行の下に挿入される）|
|P|バッファ内のテキストを挿入※（挿入位置はpの逆。文字、単語はカーソルの左に、行は現在の行の上に挿入される）|


#利用例
下記のようなシェルの中身を上記コマンドで編集していきます。

```sample.sh
#/usr/bin/sh!
a=0
while [ $a -ne 10 ]
do
   a=`expr $a + 1`
   echo 'hello test from uss'　
   sleep 5
done
```

###例1： 'df 字'でカーソルから指定した箇所(字)まで削除
カーソルをechoの'e'のところへ移動させ、'dfe'と入力し、helloの'e'までを削除します。

*コマンド実行前*

```
#/usr/bin/sh!
a=0
while [ $a -ne 10 ]
do
   a=`expr $a + 1`
   echo 'hello test from uss'　<=echoの'e'にカーソルを移動し、’dfe’と入力
   sleep 5
done
```

*コマンド実行後*

```
#/usr/bin/sh!
a=0
while [ $a -ne 10 ]
do
   a=`expr $a + 1`
   llo test from uss'　　
   sleep 5
done
```
「echo 'hello ～」でechoの'e'からhelloの'e'まで削除されました。

###例2：sでカーソル上の1文字を他の文字列に置換
今度はカーソルをhelloの'o'へ移動させ、sを入力後、任意の文字列(例：aaa)に置換します。

*コマンド実行前*

```
#/usr/bin/sh!
a=0
while [ $a -ne 10 ]
do
   a=`expr $a + 1`
   echo 'hello test from uss'　<=helloの'o'にカーソルを移動し、sを入力
   sleep 5
done
```

*コマンド実行後*
oが'$'に変わり、任意の文字列が入力可能になるので、aaaを入力

```
#/usr/bin/sh!
a=0
while [ $a -ne 10 ]
do
   a=`expr $a + 1`
   echo 'hell$ test from uss' 
   sleep 5
done

```
*置換後*
入力モードを終了させる(esc)

```
#/usr/bin/sh!
a=0
while [ $a -ne 10 ]
do
   a=`expr $a + 1`
   echo 'hellaaa test from uss' 
   sleep 5
done
```
'o'が'aaa'に置換されました。
※'s'の代わりに'r'を実行すると、カーソル上の1文字だけ置換(入力)でき、置換後は自動的に入力モードも終了します。※'r'実行後は's'とは違って対象の文字が'$'になりません。

###例3：cfで置換
例1のようにechoの'e'にカーソルを移動させ、cfと入力したあとに、置き換えたい文字までの*範囲*を指定して置換します。
例えば、範囲をhelloの'l'までならcflと入力します。
*コマンド実行前*

```
#/usr/bin/sh!
a=0
while [ $a -ne 10 ]
do
   a=`expr $a + 1`
   echo 'hello test from uss'　<=echoのeにカーソルを移動し、cflを入力
   sleep 5
done
```
*コマンド実行後*
例2と同じように、指定した箇所に'$'が表示されます

```
#/usr/bin/sh!
a=0
while [ $a -ne 10 ]
do
   a=`expr $a + 1`
   echo 'he$lo test from uss'  <=
   sleep 5
done
```
置き換えたい文字を入力(例:AAAと入力)し、Escにて入力を終了させます


```
#/usr/bin/sh!
a=0
while [ $a -ne 10 ]
do
   a=`expr $a + 1`
   AAAo 'he$lo test from uss'  <=AAAを入力後、Esc
   sleep 5
done
```
```
#/usr/bin/sh!
a=0
while [ $a -ne 10 ]
do
   a=`expr $a + 1`
   AAAlo test from uss'  <=置換
   sleep 5
done
~
```

できました。


#おわりに
直感的にわかりにくいものは例も交えてみました。
全部のコマンドを記載したわけでは無いのですが、ここで記載したものは一通りAIX上で試しました。なにかあればコメントください。