viで毎度のように置換と複数行コピーを忘れちゃうのでメモ
意外に文章で書くと長いので↓の順番で記載と大枠をのせときます。自分でも忘れるしねw
1.viでの置換 2.viでの複数行選択とそれを使った削除とかコピー&貼り付けとか 3.1と2を使って複数行内の置換 4.おまけで行数指定して置換
1.viでの置換
- 置換基本コマンド
:s
- 現在行の置換(oldからnewに)
:s/old/new/ … 現在行の最初のoldをnewに置換 :s/old/new/g … 現在行のすべてのoldをnewに置換 ※gがポイントですね
- ファイル内の置換(oldからnewに)
:%s/old/new/ … すべての行(ファイル内)の最初のoldをnewに置換 :%s/old/new/g … すべての行(ファイル内)のすべてのoldをnewに置換 ※%がポイントですね :%s/old/new/のgがないほうはどうなるの?って感じですが、↓で例を載せます
- 置換の確認
:s/old/new/c やら :%s/old/new/gc cをつければ確認
:%s/old/new/の例
replacetest.phpの中身がこれ↓だった場合にコマンドモードで':%s/number/num/'してみる
<?php $number = 1; $number = $number + 1; var_dump($number) ?>
↓
<?php $num = 1; $num = $number + 1; var_dump($num ) ?>
'%'をつけたので全行が対象ですが、gをつけなかったことでその行の最初のみが置換されてます。
※3行目:numberが2つあるが最初のみがnumになってる
2.viでの複数行選択とそれを使った削除とかコピー&貼り付けとか
詳しくはこちら↓をご参考に
http://d.hatena.ne.jp/nattou_curry_2/20090915/1253022774
↑のほぼコピーですが、要は
1.削除したい(こぴりたい)範囲の開始で「ms」と入力 2.削除したい(こぴりたい)範囲の終了で「me」と入力 3.削除の場合「:'s,'ed」、コピーの場合「:'s,'ey」と入力してEnter 4.コピー後の場合、貼り付けたい場所で「p」を入力
markのstartを入力(ms)、markのendを入力(me)して、そのstart-end間(:'s,'e)を削除(d)またはコピー(y)って感じですね
ちなみに行数指定ではこうなります
test.txt
abc
def
ghi
jkl
vi text.txtでファイルを開いてから
コマンドモードで「:set number」+「Enter」
1 abc 2 def 3 ghi 4 jkl
コマンドモードで「:2,3d」+「Enter」
1 abc 2 jkl 2 行 削除しました
3.↑の'置換'と'複数行選択'を使って範囲指定の置換
「次に複数行削除またはコピー」のところで範囲選択について触れましたが
それを使って複数行範囲内の置換を行います
replacetest.phpをつかって試し
<?php $number = 1; $number = $number + 1; var_dump($number) ?>
このファイルの2行目〜3行目内だけのnumberすべてをnumに置換します
以下、手順
1.2行目に移動して「ms」と入力
2.3行目に移動して「me」と入力
3.「:'s,'es/number/num/g」と入力
※置換の基本コマンドの「s」を忘れずに('esのところ)
※行内の「すべて」なので後ろに「g」をつけます
結果
<?php $num = 1; $num = $num + 1; var_dump($number) ?>
めでたく置換されました。終わり
おまけで行数指定の置換
:<開始行>,<終了行>s/<置換前文字>/<置換後文字>/g
こちらは