Linuxではテキストデータを良く使う。それらのテキストデータに対して置換や削除などの処理をしたいことがよくあるだろう。
このページではそういった処理をシェルスクリプトで効率的に実現する方法について紹介する。
シェルスクリプトによる置換や削除
Linuxに触れていると、テキストデータを取り扱うことが多くある。設定ファイルなどはほぼテキストデータでなりたっている。また標準出力されるものをテキストデータとして保存することも容易だ。テキストデータと向き合う時間はおそらくWindowsよりも長いはずだ。
そんなLinuxに触れていると、「この文字列をこの文字列に一括で置き換えたい」「この文字列をすべて削除したい」といったオーダーに出会う。
例えばスクリプトを使って文字列を置換し、様々な設定を自動化するということも可能だろう。このページではそういった「シェルスクリプトでの文字列処理」を取り上げる。
bash置換の書式について
- ${変数%マッチパターン} 後方からの検索の一致で一番初めにマッチした部分を削除
- ${変数%%マッチパターン} 後方からの検索の一致で一番後ろまでマッチした部分までを削除
- ${変数#マッチパターン} 前方からの検索の一致で一番初めにマッチした部分を削除
- ${変数##マッチパターン} 前方からの検索の一致で一番後ろまでマッチした部分までを削除
- ${変数/文字列/処理後文字列} 最初にマッチしたもののみ文字列を置換
- ${変数//文字列/処理後文字列} 全ての文字列を置換
sedの主な書式
文字列一括置換
$ sed -e 's/変更前の文字列/変更後の文字列/g' ./data.txt > ./data-new.txt
文字列の一括削除
$ sed -e 's/変更前の文字列//g' ./data.txt > ./data-new.txt
行の削除
パターンにマッチした行を削除
$ sed -e '/パターン/d' ./data.txt > ./data-new.txt
2~4行目を削除
$ sed -e ‘2,4d’ data.txt> ./data-new.txt
パイプラインをつかった受取
$ cat data.txt | sed -e ‘2,4d’ > ./data-new.txt
オプション -i で元テキストを直接編集保存する。
これはGNU固有のオプションとなっている。
$ sed -i -e 's/変更前の文字列/変更後の文字列/g' ./data.txt
実際にやってみよう
bashスクリプトで文字列処理をする場合、bash標準機能を使用するほか、「sed」コマンドを使用する方法もある。
bashを使う
bashの場合一応に変数内の文字列を編集する手段があるが、他のファイル内の文字列を編集するのならば「sed」コマンドの方が、直感的だろう。
vi replacement-ex1.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/usr/bin/bash #編集する文字列 VAR1="/path/test.txt.data" echo "編集前の文字列 /path/test.txt.data" #文字列を編集表示 echo ${VAR1#*/} echo ${VAR1##*/} echo ${VAR1%.*} echo ${VAR1%%.*} echo #もう一つ文字列を用意 VAR2="aaa bbb ccc aaa bbb ccc" echo "編集前の文字列 aaa bbb ccc aaa bbb ccc" #置換した文字列を表示 echo ${VAR2/aaa/ZZZ} echo ${VAR2//aaa/ZZZ} |
実行結果
$ ./replacement-ex1.sh
1 2 3 4 5 6 7 8 9 |
編集前の文字列 /path/test.txt.data path/test.txt.data test.txt.data /path/test.txt /path/test 編集前の文字列 aaa bbb ccc aaa bbb ccc ZZZ bbb ccc aaa bbb ccc ZZZ bbb ccc ZZZ bbb ccc |
sedを使う
おそらくこちらの方がわかりやすいだろう。
ファイルの内容を一定のパターンを指定して非対話的に書き換えることができる。またファイルを取りこむための手続が少なくなるので、こちらのほうが重宝するだろう。
sedは単体のエディタコマンドである。スクリプトに記述するほか、そのままコマンドとして実行できる。
vi replacement-ex2.sh
1 2 3 4 5 6 |
#!/usr/bin/bash echo "変更前" cat data.txt echo "変更後" sed -e 's/bbb/BBB/g' ./data.txt > ./data-new.txt cat data-new.txt |
実行結果
$ ./replacement-ex2.sh
1 2 3 4 5 6 7 8 9 10 |
変更前 aaa bbb ccc ddd 変更後 aaa BBB ccc ddd |
sedの主なオプション
- -i GNU特有のオプション 標準出力しないで、直接元ファイルを書き換える。つまりリダイレクトしなくてもファイルを書き換えることが出来る
- -e 変換処理のためのオプション
- d 行指定もしくはパターン指定して行を削除する。
- 番号 行を指定する。
- s 文字列置換をおこなう。最後にgをつけた場合、全ての合致する文字列を置換する。
- g 非対話的に全て置換する。
まとめ
このページではシェルスクリプトを用いて、置換や削除などの文字列処理を実施する方法についてまとめてきた。
全て覚える必要はないかもしれないが、手間の掛かる処理を一括で実行できる便利な方法なので、必要になったときに再度確認いただければと思う。
またスクリプトを使って文字列置換を駆使し
両方とも「使う」の表現
またスクリプトを使って文字列置換により
等が分かりやすい
ご指摘いただきありがとうございます。
一部文章におかしな部分がありましたので訂正いたしました。
引き続き、ご愛読のほど、よろしくお願いいたします。