カテゴリー別アーカイブ: vim

[vim]偶数行と奇数行の連結

1
a
2
b
3
c
4
d

となっているテキストファイルを

1,a
2,b
3,c
4,d

と変換したい。もちろん手作業ではとても間に合わない行数である。
awkを使おうかと思ったが、vimのマクロで行った。

1行目の先頭にカーソルがあるとする
qa マクロ記録開始
esc ノーマルモード
$a, 行の最後に移動してカンマを挿入
esc ノーマルモード
J 次の行を連結する
esc ノーマルモード
j     次の行へ移動する
q      マクロ記録終了
5@a これまでの処理を10回繰り返す

[vim]正規表現の演習

:set wrapscan 折り返し検索を有効にする
:set ignorecase 大文字と小文字の区別をしない
:set smartcase 検索文字列に1字でも大文字が含まれていたら、大文字と小文字を区別する
(ignorecaseがオンの時)
:set magic 正規表現に使われる記号を有効にする
(:set nomagicだと、「*」は文字“*”にマッチする。「¥*」で繰り返し。)

1.A* 0個以上連続したAに一致 , A, AA, AAA, …

2.A¥+ 1個以上連続したAに一致 A, AA, AAA, …

3.A. Aのに何れかの1文字がある場合に一致,改行文字は除く AB, A1, A.

4.AB¥?C AとCの間にBがないか,Bがある場合に一致 AC, ABC,AEC

5.A¥{3¥} 3個のAに一致 AAA

6.A¥{2,4} 2個以上,4個以内のAに一致 AA, AAA, AAAA

7.[a-z]+ a〜zの何れか,つまりアルファベット小文字を表す value, ascii

8.¥w¥+ 1個以上の英数文字に一致 abc, a001, 001

9.¥d+ 1個以上の数字に一致 1, 12, 123, 001

10.¥| 選択 AA¥|BB¥|CC AAまたはBBまたはCCに一致

11.¥(¥) グループ化 A¥(01¥|02¥|03¥) A01またはA02またはA03に一致

12.^ 行の最初 ^A 行頭のAに一致

13.$ 行の最後 A$ 行末のAに一致

14.[^A] A以外の文字 [^ABC]+ DEFなど1つ以上のABC以外の文字に一致

15.¥s 空白,タブ ¥s+ 1つ以上の空白に一致

16.¥S 空白文字以外 ¥S+ 1つ以上の空白以外の文字に一致

17.¥d 数値文字 ¥d+ 123など1つ以上の数字に一致

18.¥D ¥d以外 ¥D+ ABCなど1つ以上の数字以外の文字に一致

19.¥w 英数文字かアンダーバー ¥w+ ABC123など1つ以上の英数文字かアンダーバーに一致
20.¥W ¥w以外の文字 ¥W+ -+!?など1つ以上の英数文字かアンダーバー以外(記号)に一致

21.¥b 単語の境界(¥wと¥Wの境界) ABC¥bDEF ABCとDEFの間に英数文字かアンダーバー以外の文字がある文字列に一致

22.[CF+LF]の場合:¥r¥n [LF]のみ:¥n
全ての改行を指定:(¥r¥n|¥n¥r|¥n|¥r)

23.空白行
/^$/

[演習用]
1.1個以上のA
A, B, C, AA, AAA, AAAA, EEEE

2.Aの後に1個の文字
AB, ABC, A , BAC

3.AB¥?C AとCの間にBがないか,Bがある場合に一致
AC, ABC,AEC

4.3個のAに一致
AAA,AA,A,AAAA,ABC,AABB, BAAAC

5.2個以上,4個以内のAに一致
AA, AAA, AAAA ,AABBCC,AAAAB, BAAAA, ABABA,AAAAA

7.アルファベット小文字を表す
value, ascii

8.1個以上の英数文字に一致
abc, a001, 001

9.1個以上の数字に一致
1, 12, 123, 001

10.AAまたはBBまたはCCに一致
AA BB CC DD EE AABB CCDD ABBC ABCC

11.A01またはA02またはA03に一致
A01 A02 A03 A04 A05 BCA01AB ZZA02XX

12. 行の最初 ^A 行頭のAに一致
A
A
ABC

13.行の最後 A$ 行末のAに一致
ABC
ABCA
A
ZYZ A
abc A

14. 1つ以上のABC以外の文字に一致
ABC ACB XYZ DEF ACB

15.1つ以上の空白に一致
A A A A A A

16.1つ以上の空白以外の文字に一致
A B C D E F

17.空行を検索する(1行空いている行)
aaaaa

bbbbb

18.日付を検索する
2005/09/30
2005/111/1
(よくある日付の書式)

読解速度計測

lynxで英文記事を読む時の読解速度を計算したいと思った。

vimによる単語数カウント
範囲を選択して単語数を計測する
:2,10w !wc -w

時間を計測する
1. dateをunix時間に変換
$date ¥+¥%s

2. 1のコマンドを計測終了後再実行
$date ¥+¥%s

3. 1と2の差を計算(秒数)
$echo “1の結果-2の結果” | bc

読み始めと終わりの秒数差で計測が可能となる。
一分当たりの読解量=単語数/計測分
ネイティブは300以上らしい。

文字コード変換

①vimを利用する
1. ファイルに文字コードshift-jisを指定して開き直す
:e ++enc=sjis

起動時にコマンドを指定する方法もある
>vim temp.txt -c “e ++enc=sjis”
または
>vim “+e ++enc=sjis temp.txt”

2. ファイルの文字コードをutf-8に変更する
:set fileencoding=utf-8
3. 保存
:wq

一連の操作をsjis-utf8.vimというファイルにしておけば
sjis-utf8.vim
e ++enc=sjis
set fileencoding=utf-8
wq

次のコマンドで一度で変換できる
>vim sjis.txt -c “source sjis-utf8.vim”

②nkfを利用する
>sudo port install nkf

>nkf -g temp.txt
UTF-8

オラクルはSHIFT-JISなので、temp.sqlはSHIFT-JISしか受け付けない。
temp.sqlがUTF-8だった場合
>nkf -s temp.sql > temp.sql
でファイルの文字コードを変換する

ターミナルがutf-8の設定の場合実行するときにパイプで変換
>sqlplus temp.sql | nkf -w