#税込価格、税抜価格が大量に併記されたWebサイトの、税込価格を消費税増税に伴い税率を8%から10%に一括で修正した時のメモ。
<td>¥税込価格</td>
<td>(¥税抜価格)</td>
<td>¥税込価格</td>
<td>(¥税抜価格)</td>
<td>¥税込価格</td>
<td>(¥税抜価格)</td>
<td>¥税込価格</td>
<td>(¥税抜価格)</td>
<td>¥税込価格</td>
<td>(¥税抜価格)</td>
の形でズラッと並ぶ。
##perlのワンライナー
税込価格を10%にするには、8%の税込価格を一旦税抜価格に直して(税込価格÷ 1.08)、それを税率10%(税抜価格x1.1)に直せばいい。
(税率8%の税込価格 ÷ 1.08) x 1.1 = 税率10%の税込価格
cat hoge.html | perl -pe ‘s/(?<!(?:\x28))([0-9]{1,3}),([0-9]{3})(?!(?:\x29))/(($1 . $2)\/1.08)*1.1/eg’ > replaced.html
##以下解説
###正規表現で税込価格のみ抽出
####(?<!(?:\x28))([0-9]{1,3}),([0-9]{3})(?!(?:\x29))
の解説
(?<! )
キャプチャしたい対象の数値の直前に任意の文字がない
(?: )
カッコの中の文字はキャプチャしない
\x28
前カッコ
(?<!(?:\x28))
の意味は、キャプチャしたい数字の直前に、前カッコ「(」がない場合のみキャプチャする。
(?! )
キャプチャしたい対象の数値の直後に任意の文字がない
\x29
後ろカッコ
(?!(?:\x29))
の意味は、キャプチャしたい数字の直後に、後ろカッコ「)」がない場合のみキャプチャする。
これで前後にカッコを含まない数値だけキャプチャされる = ()内の税抜価格は無視され、税込価格のみ抽出される。
([0-9]{1,3})
1〜3桁の数値
([0-9]{3})
3桁の数値
([0-9]{1,3}),([0-9]{3})
は0,000~999,999 のいずれかの数値
###抽出した税込価格を一旦税抜価格に直す
####($1 . $2)\/1.08
の解説
$1
カンマの前の1〜3ケタ
$2
カンマの後の2ケタ
($1 . $2)
結合した数値
\/
÷
($1 . $2)\/1.08
は税込価格を1.08で割った数値=税抜価格
(($1 . $2)\/1.08)*1.1
税込価格を1.08で割った数値に1.1をかける
すると税込価格が8%から10%に変わる!
##このままだと¥00,000のカンマが消えてしまうので、正規表現の検索置換でカンマを追加
coteditorなどの正規表現で検索置換ができるエディターで、htmlファイルを編集
(?<=(?:\¥))([0-9]{1,3})([0-9]{3})
を$1,$2
で検索置換すると、先頭に¥を含む数字4〜6桁の数字3桁目にカンマを追加
(?<= )
キャプチャしたい数値の直前に任意の文字がある
(?: )
カッコの中の文字はキャプチャしない
\¥
¥
これで先頭に¥を伴わない、4桁〜6桁の数字列は排除される。
これをやらないと、価格ではない型番の数字の列なども検索置換されてしまいます。
([0-9]{1,3})
1〜3桁の数値
([0-9]{3})
3桁の数値
$1
=([0-9]{1,3})
$2
=([0-9]{3})
$1,$2
で000,000
の形式になる
以上です。
計算のやり方はこちらの記事から引用し、やりたかったことに合わせて自分なりにアレンジさせていただいたものです。
perlワンライナーでの計算自体の解説はこちらから。
[数値計算を含む置換をperlのワンライナーでやってみた]
(https://qiita.com/ryooku/items/cbb00897f9d2b0ac5c80)