2016-03-24

zsh: 文字パラメータの置換を「zsh特有な方法」で行う

zsh: 文字パラメータの置換を「zsh特有な方法」で行う
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でも正規表現の環境が整いだしているらしい。

コメント

  • 配列への直接操作ができると便利そう。
 この記事の履歴
  1. 開始 2016-03-24(木) 15:44

0 件のコメント:

コメントを投稿

注目の投稿

Terminalでの、なんちゃってViモドキ

近頃、ようやくKarabiner-Elementsに慣れてきたので、 Terminalで動作する「擬似Vi-Mode」を作って見たので、ご紹介します。 『概要』 「擬似Vi-Mode」の所以は、方向キー「←↓↑→」を通常の「hjkl」ではなくて「jkil」としました。これ...