zsh: Substitutions for a character parameter are carried out by using the unique commands of zsh within a function
あらすじ
最近になって、図1でハイライトした部分で、パラメータの置換操作を知りました。
Figure 1. "Modifiers on arguments", Zsh Reference Card.pdf, p6. |
参考までに以下に紹介します。
スクリプトの流れ
スクリプト名(test_Substitution)のターミナルでの動作結果を図2に示します。なお、スクリプトについては、別途を説明します。
Figure 2. Output of test_Substitution at Terminal.app. |
これと比較しつつ、以下の説明をご覧ください。
- (1) mainで文字列パラメータ$scaが作られて;
- (1.2) sca='>>>>> • fruits: i) red apple, ii) green apple. <<<<<'
- (1.3) $scaのアドレス(sca)として関数のargumentが与えられる。
- (2) pointer_called_functionに読み込まれて、
- (2.1) 読み込み時に使ったパラメータ情報を表示。読み込んだ文字パラメータは$pv1に格納された。
- (2.2) pv1='>>>>> • fruits: i) red apple, ii) green apple. <<<<<'
- (2.3) 簡単な複数置換をし、最後に大文字(Upper case)に変換した。
- (2.4) pv1='»»»»» •ANIMALS: I) BLACK CAT, II) WHITE CAT. «««««'
- (2.5) zshでは、手動でメインの変数に$pv1の値を上書き(override)が必須.。
- だから「擬似ポインタ!」と呼ばれる理由だと思う。
- この上書きが必要ないなら、(2.5)は不要になる。
- (3) mainに戻ると、$scaは正しく(2.4)を反映している!
- (3.1) sca='»»»»» •ANIMALS: I) BLACK CAT, II) WHITE CAT. «««««'
スクリプト
#!/bin/zsh #!/bin/zsh # Usage:test_Substitution↩ # Purpose: To memorize; # 1) Example of substitutiones by using "Modifiers on arguments", # 2) Example of function of address call with overwrite to main, # 3) Sumarize information of parameters usen in above function. # ##################################################################### stringReplacement(){ #------------------ argument $1:pointer address --------------------# local pt1=$1 # pt1: pointer address of $1 local pv1=${(P)pt1} # pv1: pointed value addressed by pt1 # #------------------ engine of function for parameter $pv1 ----------# echo "•••••••••••••••••••••••••••••••••••••••••••••••••••••••• (2) $0 •" echo "(2.1) Information on pt1=\$1 # \$pt1: pointer in \$1" echo " (2.1.a) \${1}'s type: ${(t)1}" echo " (2.1.b) \${pt1}'s type: ${(t)pt1}" echo " \${pt1}'s value: '${pt1}'" echo " (2.1.c) \${pv1}'s type: ${(t)pv1}" echo "(2.2) Value of \$pv1=\${(P)pt1} # same value to (1.2)" echo -n ' ' bold_Rbw_echo ${(qq)pv1} echo "(2.3) Substitutions & Uppercase modification for \$pv1" echo " • fruits → animals, apple → cat, green → white,… etc." # replace to new value by step by step change on $pv1 pv1=${pv1:s% fruits%animals%} # :s%s1%s2% # ↑ Substitute s1 with s2. pv1=${pv1:gs%apple%cat%} # :gs%s1%s2% # ↑ Globally Substitute s1 ← s2. # [:sg%...] ==> error. # ↑ in sed: 's%s1%s2%g' pv1=${pv1:s%green%white%} pv1=${pv1:s%red%black%} pv1=${pv1:gs%>%»%} pv1=${pv1:gs%<%«%} pv1=${pv1:u} # (U) convert to Upper case. echo "(2.4) Value of \$pv1 replaced by (2.3)" echo -n ' ' bold_Rbw_echo ${(qq)pv1} echo "(2.5) \$pv1 ---> \$pt1: overwrite by (eqn.1a) or (eqn.1b )" # #------------------ overwrite $pv1 to original value $pt1 in main ------------# echo "(2.6) overwritten by using (eqn.1b)" #eval "$pt1='$pv1'" #--------------------------- ok ---------- (eqn.1a) eval "$pt1=${(qq)pv1}" #-------------------------- ok ---------- (eqn.1b) # both of (eqn.1a or eqn.1b) work well, # as '$pv1' <==> ${(qq)pv1}, (eqn.1a) <==> (eqn.1b) } ##################################################################### bold_echo(){echo "\e[38;1m${@}\e[m"} bold_mag_echo(){echo "\e[1;7;35m${@}\e[0m"} bold_Rbw_echo(){echo "\e[1;7;38m${@}\e[0m"} ##################################################################### # -------------------------- main --------------------------------- # ##################################################################### echo "•••••••••••••••••••••••••••••••••••••••••••••••••••••••••• (1) main •" local sca='>>>>> • fruits: i) red apple, ii) green apple. <<<<<' echo "(1.1) Type of \$sca: ${(t)sca}" echo "(1.2) Value of \$sca:" echo -n ' ' bold_mag_echo ${(qq)sca} echo "(1.3) Call \"stringReplacement sca\"" echo " # ↑ Notice: 'not \$sca'," echo " # because it is address." echo stringReplacement sca echo echo "•••••••••••••••••••••••••••••••••••••••••••••••••• (3) back to main •" echo "(3.1) Value of \$sca: it's to the value of (2.3)" echo -n ' ' bold_mag_echo ${(qq)sca} echo
- 動作環境
- OS Yosemite 10.10.5
- Terminal Version 2.5.3 (343.7)
- zsh 5.0.5 (x86_64-apple-darwin14.0)
まとめ
- 図1でのパラメータ置換では正規表現(regex)を使えない!
- 日常的なデータ整理には使える。
- 正規表現(regex)が必要なら、従来のgrep,shed,awkは適宜に使う必要がある。
- Pointerの関係で、XcodeでC言語を動かしていた、
- 意外と使えた!
- 当面は、現在のzshの環境の中で、CとSwiftとを練習したい。
- その後、C++とかにトライしたい。
- 最近は、Swiftでも正規表現の環境が整いだしているらしい。
コメント
- 配列への直接操作ができると便利そう。
この記事の履歴
- 開始 2016-03-24(木) 15:44