読者です 読者をやめる 読者になる 読者になる

tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

viでの置換とか複数行コピーとか

linux vi

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

こちらは