vi エディタでの空白文字の削除

vi エディタを使っていて
空白のみ削除する方法を探しました
前回は、vi の機能を使ってファイルの文字列を調べました
しかし、空白をカウントしていないのではなく
前回のテストのときには、改行をカウントしていないだけでした
今回は、空白文字だけを削除してみました
まず、ファイル内の半角空白を削除するには
:%s/ *//g
とします
これで、半角の空白が削除されます
次に、全角の空白を削除するには
:%s/ *//g
とします
これで全角の空白が消えます
全角の空白を消すのは、ソースコードや
設定ファイルの中に空白文字が混ざったときに対処するのに使えそうです
最後に、
:%s/./&/g
で文字数を確認し、消したことにより文字数が減っているなら成功です

vi エディタでの文字数を調べる方法

vi テキストエディタを使い、ファイル内の文字数を調べることができます
最初は wc コマンドを使う予定でしたが、バイト数の取得などは
できるものの、文字数の取得はできないため、断念しました
ちなみに、wc コマンドは
【 wc 】 テキスト・ファイルの行数,単語数,バイト数を表示
を参照
今回、その代わりに行ったのが
vi エディタでの文字数のカウントです
Emacs で文字数を数える をみて
Emacs でもできるなら、vi でもできそうということで
vimでの文字数カウント方法
を参考に実験
vi test.txt

内容を
test
テスト
test
とし
:%s/./&/g
を実行
結果、日本語のバイト数、空白をカウントしないという
条件をみたしたので、今後、文字数のカウントには
この方法を使おうと思います

選択範囲にシェルのコマンドを実行

他にも、vi には便利な機能があります
指定した範囲に対して、シェルのコマンドを実行し、現在の内容と書き換えることができます
この構文は
範囲 !コマンド
になります
例として
linux fedora mac
windows mac win
linux fedora android
mac win ubuntu
debian redhat knopix
backtrack vine
という内容のファイルで
:%!cat -n
とすると
1 linux fedora mac
2 windows mac win
3 linux fedora android
4 mac win ubuntu
5 debian redhat knopix
6 backtrack vine
~
というように
番号がついて表示されます
また
:.,$w text.txt
というようすることで
指定した行を別のファイルに書き出すことも可能です
ただし、:w で保存したい場合
正規表現を使えません
正規表現を使って、当てはまる条件のものだけを別のファイルに抜き出すには
001:田中:男:21
002:鈴木:女:19
003:伊藤:男:31
004:山田:女:27
005:井上:男:18
006:佐藤:女:22
の場合
:w !grep “:男:” > men.txt
とすると
:男:
の文字を含む行だけを抜きだしたファイルを
作成できます
ちなみに内容は
001:田中:男:21
003:伊藤:男:31
005:井上:男:18
となり、無事に男の名前のみ抜き出したファイルが作成されました
ちなみに、行ったexコマンドの実行結果は
$history のように
:his
で実行結果をみれます
ただし、一度 vi を閉じると
この履歴は見れないようです

正規表現で置き換え文字を指定

正規表現を置き換え文字の指定に使えます
例として
001:田中:男:21
002:鈴木:女:19
003:伊藤:男:31
004:山田:女:27
005:井上:男:18
006:佐藤:女:22
という内容のファイルの性別のところを削除
してみます
:%s/:[男女]:/:/g
を実行すると
:男:と:女:の部分が
:
に置き換えられて
001:田中:21
002:鈴木:19
003:伊藤:31
004:山田:27
005:井上:18
006:佐藤:22
となります
また、vi のexコマンド :d と正規表現を
組み合わせ、対象行を設定できます
もし、:男: を含む行を削除するなら
:g/:男:/d
とすれば
001:田中:男:21
002:鈴木:女:19
003:伊藤:男:31
004:山田:女:27
005:井上:男:18
006:佐藤:女:22

002:鈴木:女:19
004:山田:女:27
006:佐藤:女:22
となります
この正規表現置き換えは
ビジュアルモード
でもできます
例として
:v で
ビジュアルモードになり範囲指定後に

をタイプすると
:’<,'>
がでるので
これに続いて 変更内容を記述します
今回は : を, に変更してみます
これを実行するには
:<','>s/:/,/g
とすれば
選択範囲が書き換えられ
001,田中,男,21
002,鈴木,女,19
003,伊藤,男,31
004,山田,女,27
005,井上,男,18
006,佐藤,女,22
となります

vi で正規表現による置き換え

vi 範囲を指定するときなどに
正規表現を使うと、効率的な
編集が可能になります
とくに、
コメントアウトなどの作業にはとても役立ちます
行頭を示す ^
ファイルの最後を示す $
現在のカーソルを示す .
これらを使い、現在のカーソル位置から
ファイルの最後まで、行頭に#を追加し
コメントアウトします
:.,$s/^/# /
unix mac linux unix windows linux
# unix mac linux unix windows linux
# unix mac linux unix windows linux
# unix mac linux unix windows linux
# unix mac linux unix windows linux
# unix mac linux unix windows linux
となりました
この方法を使うと
設定ファイルで、セキュリティ対応のため
コメントアウトするという場所が
たくさん存在するというときに
非常に役立ちます
さすがに
1行ずつ#を加えていくのは大変ですから
また、行頭が~で始まるところだけ置き換えるということもできます
これには
置き換えする範囲を正規表現で指定する機能をつかいます
構文は
:g/正規表現パターン/s/変える文字/変えたい文字/g
とします
今回の例では
行頭が linux で始まるところを変換してみます
linux fedora mac
windows mac win
linux fedora android
mac win ubuntu
debian redhat knopix
backtrack vine
~
というファイルを変更します
:g/^linux/s/linux/redhat enterprize/g
を実行すると
redhat enterprize fedora mac
windows mac win
redhat enterprize fedora android
mac win ubuntu
debian redhat knopix
backtrack vine
となりました

vi のフラグ

viのフラグを使うことで、より効率的に
編集することができます
通常、範囲を指定しないと
最初の当てはまる文字だけ変換するだけですが
g フラグをつけると、範囲内すべてを変換できます
例えば
unix mac linux unix windows linux
unix mac linux unix windows linux
unix mac linux unix windows linux
unix mac linux unix windows linux
unix mac linux unix windows linux
unix mac linux unix windows linux
という内容のファイルを変換するときに
:s/unix/linux/
では
linux mac linux unix windows linux
unix mac linux unix windows linux
unix mac linux unix windows linux
unix mac linux unix windows linux
unix mac linux unix windows linux
unix mac linux unix windows linux
となりますが
:s/unix/linux/g
とすると
linux mac linux linux windows linux
unix mac linux unix windows linux
unix mac linux unix windows linux
unix mac linux unix windows linux
unix mac linux unix windows linux
unix mac linux unix windows linux
というように、カーソルの行すべてを変換します
また、大文字、小文字を関係なく変換するには
i オプションを使います
オプションは組み合わせて使用できます
例えば
:s/unix/linux/gi
とすれば、大文字小文字関係なく変換できます
もっとも多用するのが、範囲指定です
範囲指定に
%
を使うことで、ファイル内すべてを指定できます
逆に範囲指定するには
1,2 というように開始行終了行を指定します
<例>%で当てはまる範囲をファイルすべてに指定 :%s/unix/linux/gi <例2>2~5行めのみ変換
:2,5s/mac/windows/g
このように、範囲指定には
開始行,終了行
というように設定します
ちなみに、例2の実行結果は
unix mac linux unix windows linux
unix windows linux unix windows linux
unix windows linux unix windows linux
unix windows linux unix windows linux
unix windows linux unix windows linux
unix mac linux unix windows linux
となりました
行番号がわからず、もしくは
調べるのが面倒な場合
.


を使うと便利です
. は、現在のカーソル位置を示し
$は最終行を意味します
すべて変えるなら

で十分です
<例>最初から、カーソルのある2行めまで
linux をfedora へ変更
:1,.s/linux/fedora/g
unix mac fedora unix windows fedora
unix mac fedora unix windows fedora
unix mac linux unix windows linux
unix mac linux unix windows linux
unix mac linux unix windows linux
unix mac linux unix windows linux
<例2>カーソルのある2行めから最後まで
unix を ubuntu へ変更
(最初のunixのみ)
:.,$s/unix/ubuntu/
unix mac linux unix windows linux
ubuntu mac linux unix windows linux
ubuntu mac linux unix windows linux
ubuntu mac linux unix windows linux
ubuntu mac linux unix windows linux
ubuntu mac linux unix windows linux
この方法を使うと、かなり効率的に設定ファイルを変更できます
とくに、apache の設定を変更
などというときには
あらかじめ
:set number
で場所を調べておき
この設定変更を使うと、簡単に置き換えできます

vi の文字置き換え機能

vi ではsed コマンドのようにuravi
文字の置き換えができます
構文は
:範囲s/置き換える文字/置き換えたい文字/フラグ
となります
範囲については
行単位で指定となり、省略すると現在のカーソルの行のみになります
例題として
unix mac linux windows unix linux
というファイルを
vi test2
で作成し
yy5p
で内容をコピーし
:s/unix/linux/
とすると
カーソルの行だけ変更されますが
あとはそのままです
これらを解決するには
フラグを利用します

使うと便利な exコマンド

vi でファイルを編集しているときに
よく、パスを記述するのにわからない
そのため、一度vi を終了し
ls -l を実行し、その後再度 vi で編集
とすることがあると思います
そんなときには
vi の exコマンドがとても役立ちます
例えば
vi スクリプトを作成しているときに
/home/wiki/Document
の一覧を見たいときには
:!ls -l /home/wiki/Document
とすれば
わざわざ一度 vi を終了しなくても
見ることができます
さらに、もっと楽にすることもできます
exコマンドの実行結果を
カーソルの次の行に書き込むことnができます
構文は
:r !コマンド
となります
例えば
:r ! date
とすれば
現在の日時がカーソルの次の行に
書き込まれます

vi のビジュアルモード

vi にはビジュアルモードがあります
vi を立ち上げ
v
を入力するとビジュアルモードになります
この状態では
コピペするときに、マウスで文字列を反転させたような状態になりますので
カーソルで任意の範囲を選び
コピー、削除を行えます
ビジュアルモードの主なコマンドには
d
選択範囲のテキストを削除
D
選択範囲を含む行ごと削除
y
選択範囲をヤンクバッファに格納
Y
選択範囲を行ごとヤンクバッファに格納
c
選択範囲を削除し、書き込み可能なインサートモードにする
C
選択範囲を行ごと削除し、書き込み可能なインサートモードになる
ESC
コマンドモードに戻る
があります
ビジュアルモードは3種類あり
今回つかったようなノーマルビジュアルモードの他に
行単位で設定できる
ラインビジュアルモード
そして
まだ使ったことはないのですが
ブロックビジュアルモードがあります
ノーマルビジュアルモードにするには
v
を入力しますが
ラインビジュアルモードにするには
V
を入力します
ブロックビジュアルモードを使うには
Ctrl + v
を入力します

vi とヤンクバッファ

d や x などで削除した文字は
じつはヤンクバッファに一時格納されています
このため、pを使い、削除した文字列をコピーできます
このときに、削除したのが文字単位
つまり
d
x
dw
もしくは
d~ でカーソルから
行頭まで削除
などの場合カーソルの直後にコピーされますが
行単位、つまり
dd
などの場合、次の行にコピーされます
これを忘れると
yy
でコピーした後に、なぜか
d で削除した文字がコピーされていると
いうようなことがおきます
また、コピーするときに
pでは
カーソルの後になりますが
Pとすれば、カーソルの前になります