はじめに
AIX上でシェル・スクリプトとかを書くときに、viやemacsなど、いくつかeditorが提供されていますが、自分はviを良く利用します。
似たようなことをまとめている人が多数ですが、AIXをこれから触っていく人向けへのTipsとして、自身の備忘録も兼ねて、以下にviの操作方法をまとめておきます。
起動
作法 | 意味 |
---|---|
vi ファイル名 | 編集対象のファイルを開く(複数ファイルも可) |
vi +n ファイル名 | n 行目から表示する |
vi +/文字列 ファイル名 | 文字列が存在する行から表示する |
入力・編集
※コマンドモードでここのコマンドを入力すると入力モードになります
作法 | 意味 |
---|---|
a | カーソルの右から入力開始 |
A | 行末から入力開始 |
i | カーソルの左から入力開始 |
I | 行の頭から入力開始 |
o | 現在の行の下に1行挿入し、その行頭から入力開始 |
O | 現在の行の上に1行挿入し、その行頭から入力開始 |
J | 次の行と現在の行とを結合する |
nJ | 下のn行を現在の行とを結合する |
削除
作法 | 意味 | 例 |
---|---|---|
x | カーソル上の1文字削除 | |
X | カーソルの左の文字を1文字削除 | |
dd | 現在の行を削除 | |
ndd | n 行、削除 | |
dw | カーソル上の一単語を削除 | |
df 字 | カーソル位置から指定した字 までを削除 | *1 |
d$ | カーソル位置から行の最後までを削除 | |
d^ | カーソル位置から行の先頭までを削除 | |
:行1, 行2 d | 行1 から行2 を削除 |
置換
作法 | 意味 | 例 |
---|---|---|
r | カーソル上の1文字を他の1文字に置換 | |
s | カーソルのある1文字を他の文字列で置換 | *2 |
S | 現在の行を他の文字列で置換 | |
cw | カーソル位置からその単語の最後までを置換 | |
cf 字 | カーソル位置から指定した字 までを置換 | *3 |
C | カーソル位置から行の最後までを置換 | |
:%s/置換え前/置換え後 | 置換え前の文字列を、置換え後の文字列で置換(各行で最も近くにある文字列一つに対してのみ実行 | |
:%s/置換え前/置換え後/g | ファイルの中すべての文字列に対して、置換えを行う | |
~(チルダ) | 大文字/小文字を変更 |
検索
作法 | 意味 |
---|---|
/<文字列> | 文字列 を検索する |
?<文字列> | 文字列を検索する(逆方向) |
n | 順方向へ検索する |
N | 逆方向へ検索する |
Cut&Paste
作法 | 意味 |
---|---|
yy | 現在の行をバッファにコピー |
nyy | n 行分をバッファにコピー |
yw | 単語をバッファにコピー |
p | バッファ内のテキストを挿入※(文字、単語はカーソルの右に、行は現在の行の下に挿入される) |
P | バッファ内のテキストを挿入※(挿入位置はpの逆。文字、単語はカーソルの左に、行は現在の行の上に挿入される) |
利用例
下記のようなシェルの中身を上記コマンドで編集していきます。
#/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上で試しました。なにかあればコメントください。