テキストの編集あれこれ
このページはviやshellの使い方をマスターするといった内容でなく、テキスト編集時の際はこんな方法を使えば早く仕上げることができる、といったことを解説したページになります。普段テキスト編集したい時、その時のやりたい内容に応じてvi使ったり、shellの様々なコマンドやらと組み合わせて実現するのでそれの備忘録。
ファイルの文字列を置換
ケース1:複数ファイルの同じ文字列を置換する場合
同じような置換をしたいファイルが複数ある場合、ひとつづつファイルを開いて変更すると時間がかかる場合に一括変換する方法。
sedの-i
オプションで上書き置換となるのでこれを利用。また-i.bak
とやると.bakという拡張子でコピーが作成されるので、バックアップとして使える。ただし置換されないファイルを含め、全てのファイルに対してバックアップを作る。
例えばtxt
の拡張子を持つ複数のファイルがあって、ファイル中のhoge
で終わる文字列をHOGE
に変換する場合は以下の通り。
$ sed -i.bak 's/hoge$/HOGE/g' *.txt
ケース2:複数のサーバに置換したいファイルが複数ある場合
複数のサーバにファイルがある場合はansibleを使って置換が加納。web01,web02の2つのサーバにあるファイルを置換する場合は以下。
playbookのインベントリファイルの定義。
[web:children]
web01
web02
###
[web01]
10.10.10.10
[web02]
10.10.10.11
置換したいファイルを絶対パスで指定。/tmpフォルダにあるtxtの拡張子
$ ansible -i inventory/inventory.ini web -m shell -a 'sed -i.bak s/hoge$/HOGE/g /tmp/*.txt'
ケース3:マッチした文字列の行の上/下に文字列を追加する
マッチした文字列の上/下に任意の文字列を追加する。
複数ファイルが対象の場合はケース1と同じ。
aaa
bbb
# comment
ccc
# comment
行の上に文字列を追加する場合
$ sed -i '/^# comment/i ----上に行追加' test.txt
$ cat test.txt
aaa
bbb
----上に行加行
# comment
ccc
# 下に行を追加する場合
$ sed -i '/^# comment/a ----下に行を追加' test.txt
テキストの各行に文字や数値を入れたい
下記のようなテキストの各行の先頭に文字や数値を入れたい場合
色々やり方はあるかと思いますが、私はviで以下のようにして編集する。
CSV風に0,
を入れる場合はこんな感じ。
# viのノーマルモードで以下を実施
gg # ファイルの先頭行に移動
V # 行指定のVisualモード(範囲指定の<C-g>でもオッケー)
G # ファイルの最終行まで範囲指定
:normal I0,<RTN> # ノーマルモードからのI(行先頭インサート)での「0,」を入れる!
ちなみにviのキー操作の最後:normal I0,<RTN>
を:normal A,0<RTN>
にすると各行の最終行に,0
が挿入される。
挿入した各行の数値を変更する
テキストに連番を振りたい場合やテキスト内の数値を変更したい場合もviを使って実施する
連番を振る場合
# viのノーマルモードで以下を実施
gg # ファイルの先頭行に移動
<C-v> # Ctrl+vでVisualモード
G # ファイルの最終行まで数値を指定
g<C-a> # g押下後にCtrl+aで数値をインクリメント
g
がないと各行同じ分だけ数値が増加する。例えば11<C-a>
だと下記のようになる。逆に減らす場合は<C-x>
"0x"の数値に連番を振る場合
set nf=""