文字列置換のtips

こんにちは、鶴田です。

今回は、文字列置換について少し説明しようかなと思います。

文字列置換のメリット

システムのバージョンアップに伴い、古い記述(新しいバージョンでは推奨されない記述)を修正する必要が生じることがあります。

この際、文字列置換を行う際の条件として、同じ文言を一括で変更したい場合があります。

特に古いシステムのバージョンアップ時には、ソースコード全体に修正が必要なことがあります。

手作業でこれらの変更を行うと、非常に面倒で大変な作業となり、さらに漏れが生じる可能性もあります。

ここで、便利なのが今回ご紹介する置換方法です。これを活用することで、効率的に古い記述を新しいものに置換することが可能となります。

文字列置換の基本的なやり方

置換時に利用するコマンド

find: ファイル名を検索する

xargs: コマンドの出力を別のコマンドの引数にする

sed: ファイル内検索・置き換え

 

コマンドの説明
●find
ファイル名で検索
(例).phpファイルを検索
find . -type f -name “*.php”
 
検索範囲からディレクトリを除外
(例)vendorを検索範囲から除外
-path “./vendor” -prune -o
 
●sed
検索にヒットした文字列を置換
sed -i -e “s/検索したい/これに置き換える/g”
 
n番目にヒットした文字列を置換
sed -i -e “s/検索したい/これに置き換える/n”
 
特定の文字列がある行の文字列を置換
sed -i -e “/特定の文字列/s/置き換え対象/これに置き換える/g”
 
改行の置換(-zプション追加)
sed -z-e “s/\n/置き換える/g”
削除したい場合は置き換え先を空にするといい
 
●よく使う正規表現
まとめきれないので参考サイト↓
 
●エスケープ文字一覧

エスケープ前エスケープ後注意点
\\\エスケープを行う文字そのものなので、\ だけの記述はできません。
\\ にマッチングさせたい場合は \\ と記述してください。
*\* 
+\+ 
.\. 
?\? 
{ }\{\}出現回数指定文字なのでエスケープが必要
( )\(\)エスケープしないと後方参照が作成される。
またはグループ化される。
[ ]\[\]直前文字の出現回数指定文字なのでエスケープが必要
^\^行頭を指定することになる。
$\$行末を指定することになる。Perlの場合は、変数の先頭文字である。
\-[ ]の中に書く場合のみエスケープが必要
|\| 
/\/Perlでは / が正規表現の指定になるのでエスケープが必要。
言語によっては、” がエスケープが必要となる。

 

1回の置換で置換できないときの置換のやり方

置換したいが正規表現なんてよくわからんしめんどくさいときの考え方

一度で置換するのではなく段々と置換していく方法

置換例 symfony3のroutingの書き方からsymfony4のroutingの書き方へ

置き換え内容
defaults: { _controller: “AppBundle:Default:index” }
controller: App\AppBundle\Controller\DefaultController::indexAction
 
変換の流れ
1.defaults: { _を削除(置き換え後にいらないので削除)
 コマンド

 find . -path -type f -name "*.yml" | xargs sed -i -e '/s/defaults: { _//g'
 実行後予想

 controller: "AppBundle:Default:index" }
 
2.”AppBundle:をApp\AppBundle\Controller\に変換
 コマンド

 find . -path -type f -name "*.yml" | xargs sed -i -e '/s/"AppBundle:/App\AppBundle\Controller\\/g'
 実行後予想

 controller: App\AppBundle\Controller\Default:index" }
 
3.二つ目の:をController::に変換
 コマンド

 find . -path -type f -name "*.yml" | xargs sed -i -e '/s/:/Controller::/2'
 実行後予想

 controller: App\AppBundle\Controller\DefaultController::index" }
 
4.” }をActionに変換
 コマンド

 find . -path -type f -name "*.yml" | xargs sed -i -e '/s/" }/Action/g'
 実行後予想

 controller: App\AppBundle\Controller\DefaultController::indexAction
コマンドまとめ


 find . -type f -name "*.yml" | xargs sed -i -e 's/defaults: { _//g'
 find . -type f -name "*.yml" | xargs sed -i -e 's/"AppBundle:/App\\AppBundle\\Controller\\/g'
 find . -type f -name "*.yml" | xargs sed -i -e 's/:/Controller::/2'
 find . -type f -name "*.yml" | xargs sed -i -e 's/" }/Action/g'
 find . -type f -name "*.yml" | xargs sed -i -e 's/typeController:/type/g'
 
少し長くなってきたので今回はこの辺で終わりたいと思います。
 
○以下参考になるサイト一覧
・正規表現の使い方
https://armadillo.atmark-techno.com/blog/15992/12568
・sedコマンド説明サイト
https://shellscript.sunone.me/filter_sed.html
・sedコマンドわかりやすい例
https://itneko.com/sed-escape/
・findコマンド説明サイト
https://eng-entrance.com/linux-command-find
・xargsコマンド説明サイト
https://hydrocul.github.io/wiki/commands/xargs.html