chp
ファイル内の文字列を一括置換するツール(shスクリプト)です。
機能
exコマンドを使用して文字列を置換します(※1)。
被置換文字列(置換される文字列)に正規表現を指定できます。
置換が行われない場合、ファイルのタイムスタンプは更新されません(※2)。
※1 exの:%s/被置換文字列/置換文字列/g
実装では/
ではなくASCII制御文字のENQ(^E、0x05)を使用しています。
問い合わせ(Enquiry)の意味でENQを使っているわけではありません。
通常使わない文字を区切り文字として使用しているだけです。
これまでEOT(^D、0x04)を使っていましたが、Solaris 10でエラーとなったため
ENQ(^E、0x05)を使用しています。
※2 exはx
で終了しています。
使用方法
【呼び出し形式】
chp 被置換文字列 置換文字列 ファイル(複数)
【パラメータの説明】
パラメータ | 内容 | 備考 |
---|---|---|
第1引数 | 被置換文字列 | exの正規表現 |
第2引数 | 置換文字列 | |
以降の引数 | ファイル | 複数指定可 |
実装
#!/bin/sh
case $# in
0|1|2)cat <<EOF 1>&2
Usage: chp re string files...
EOF
exit 1
esac
re=$1
str=$2
shift 2
for file in $@
do
ex -s ${file} <<EOF
:%s^E${re}^E${str}^Eg
x
EOF
done
$\color{red}{\rm 【注意】}$
^EはENQ(0x05)です。
ASCII制御コードの入力は以下を参考にしてください。
viコマンドで制御文字を入力 coneta #2
実装(改)
当然な話ですが、クリップボードコピー&ペーストした後に制御コード(^E)を修正し忘れたらうまく動きませんでした。
ということで制御コードなし版です。
動作確認はWSL(※)で行いました。
※ uname -s -r -v -m -p -i -o
※ Linux 4.4.0-17763-Microsoft #379-Microsoft Wed Mar 06 19:16:00 PST 2019 x86_64 x86_64 x86_64 GNU/Linux
#!/bin/bash
case $# in
0|1|2)cat <<EOF 1>&2
Usage: chp re string files...
EOF
exit 1
esac
DLMT=$(echo -n -e "\x05")
re=$1
str=$2
shift 2
for file in $@
do
ex -s ${file} <<EOF
:%s${DLMT}${re}${DLMT}${str}${DLMT}g
x
EOF
done
環境
ホスト Windows10 COREi7
VM VirtualBox バージョン 5.2.8 r121009 (Qt5.6.2)
OS CentOS Linux release 7.4.1708 (Core)
3.10.0-693.21.1.el7.x86_64 #1 SMP Wed Mar 7 19:03:37 UTC 2018
ex version 7.4.160
OS SunOS 5.10 Generic_147148-26
ex 標準
OS SunOS 5.11 11.3
ex version 7.3.600
OS MINGW64_NT-10.0 2.9.0(0.318/5/3) 2017-09-13 23:16
ex version 8.0.1305