置換と検索

置換と検索

 テキストファイルの文字列を検索するコマンドを使うと、素早く目的の位置に移動することができる。また、置換コマンドを使えば文章中の文字列を探して、別の文字列に置き換えることも素早く行うことができる。

コマンド 内容
/検索文字列 文字列の検索
n 上方向へ再検索
N 下方向へ再検索
:対象の行/s検索文字列/置換文字列/オプション 文字列を置換する

文字列の検索

 テキストの中から目的の文字列のカーソルへ移動するためには、/ コマンドを用いる。/ の後に検索したい文字列を続けて入力する。

/ 文字列

ファイルの中に同じ文字列が複数存在する場合、n コマンドまたは N コマンドで繰り返し探し出せる。n キーを押すと1つ次の文字列を再検索し、N キーは1つ前の文字列を再検索する。

 n キーまたは N キーは押した分だけ再検索される。

文字列の置換

 vi コマンドでは文字の置換を行うこともできる。

:対象の行 s/ 検索文字列 / 置換文字列 / オプション
コマンド 内容
:ns/old/new n行目の最初の old を new に置換して終了
:ns/old/new/g n行目の全ての old を new に置換して終了
:%s/old/newg ファイル全体の検索文字語句を置換する
:%s/old/new/gc 置換の度に確認を求める

 対象の行を省略すると現在カーソルがある行だけが置換対象になる。オプション g を指定すると1行にある複数の検索文字列を置換する。( g を指定しないと行ごとに1回だけ置換をする )

実行例

vi コマンドでサンプルファイル ( vireplace.txt ) を事前に準備する

$ cat vireplace.txt
lemon orange banana melon lemon
orange banana melon lemon orange
banana melon lemon orange banana
melon lemon orange banana melon
lemon orange banana melon lemon
orange banana melon lemon orange
banana melon lemon orange banana
melon lemon orange banana melon

vi コマンドでファイルを開く

$ vi vireplace.txt

1行目のbananをBANANAに置換する

:1s/banana/BANANA/g

実行結果 1行目

lemon orange BANANA melon lemon

次にorangeをORANGEに置換する。

:1s/orange/ORANGE/

実行結果 1行目

lemon ORANGE BANANA melon lemon
次は g オプションの有無での動作の違いを確認する。

2行目のorangeをORANGEに置換する。 ( g オプション有り )

:2s/orange/ORANGE/g

実行結果 2行目

ORANGE banana melon lemon ORANGE

g オプションをつけた場合指定した行にある全ての文字列を別の文字列に置換する。

次に3行目の banana を BANANA に置換する。 ( g オプション無し )

:3s/banana/BANANA

実行結果 3行目

BANANA melon lemon orange banana

g オプションを付けなかった場合、指定した行にある最初の該当文字のみ、別の文字列に置換する。

ファイル全体の文字列置換

 ファイル全体の melon を *MELON* に置換する

:%s/melon/*MELON*/g

実行結果

lemon ORANGE BANANA *MELON* lemon
ORANGE banana *MELON* lemon ORANGE
BANANA *MELON* lemon orange banana
*MELON* lemon orange banana *MELON*
lemon orange banana *MELON* lemon
orange banana *MELON* lemon orange
banana *MELON* lemon orange banana
*MELON* lemon orange banana *MELON*

 行数ではなく % を指定した場合、置換範囲はファイル全体を検索範囲とする。ファイル全体の中にある melon という文字列を *MELON* に置換できた。

確認しながらファイル全体を文字列置換

 一括置換は非常に便利だが、時には確認しながら置換したいケースも考えられる。その場合は gc オプションを用いる。

 ファイル全体の lemon を @LEMON@ に確認をしながら置換する。

:%s/lemon/@LEMON@/gc

実行すると確認メッセージが表示される。この時点ではまだ置換は実行されない。

vi 20

y を押すと置換が実行され、次の lemon を置換するか確認メッセージが表示される。

vi 21

n を入力すると文字列置換を実行しない。該当文字列が見つからなくなるまで確認メッセージが表示される。

vi 22

q を入力すると文字列置換を中止できる。

vi 23