LoginSignup
1
0

More than 3 years have passed since last update.

chp ファイル内の文字列を一括置換するツール coneta #6

Last updated at Posted at 2018-06-27

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引数 置換文字列
以降の引数 ファイル 複数指定可

実装

chp
#!/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

chp
#!/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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0