偶数か奇数かで引用符を切り替える
※引用符はASCII コードで指定すれば、下のようなことをする必要はありません。
アホとハサミは使いようというか、アホにハサミを持たせてはいけませんね!
というわけでTTLメーカーサンプルを見てください。
複数の引用符が連なる行をTTLマクロで自動送信するの続き。
1重引用符と2重引用符の両方を含むこのようなコマンド行。
まず、先に来ない方の引用符(この例では「'」)で区切った配列にするとこうなる。 *1
それらを、配列の区切り文字に使ったその引用符で囲むとこうなる。
ただし、もとの文字列の 'we' の「'」はつけ直す必要がある。あとは、配列インデックスが奇数のときに、そのさらに外側を「'」には「"」で、「"」には「'」で囲んでやればいい! *2
先頭にteratermマクロ関数の「send」と、最後にLFの#10も加えてTTLマクロになった結果は、
デモはTTLマクロメーカー
ソースのサンプル。先にあるのが「'」なら「"」を、「"」なら「'」を返すような関数を用意しておいて、
*2: シェルでそういう使い方が必要な時があるとするならば、行の最初に見つかった引用符が後ろでネストして使われているとだめ。たとえば、「echo "$MJ" |grep 'a"$b"c'」
アホとハサミは使いようというか、アホにハサミを持たせてはいけませんね!
というわけでTTLメーカーサンプルを見てください。
複数の引用符が連なる行をTTLマクロで自動送信するの続き。
1重引用符と2重引用符の両方を含むこのようなコマンド行。
echo "$MJ" |grep 'we' |egrep "[MJ]"
まず、先に来ない方の引用符(この例では「'」)で区切った配列にするとこうなる。 *1
0| echo "$MJ" |grep*1: ふつうsplit関数やメソッドは区切り文字は削除して返すので、we の左右の引用符はなくなる。
1| we
2| |egrep "[MJ]"
それらを、配列の区切り文字に使ったその引用符で囲むとこうなる。
0| 'echo "$MJ" |grep 'この時点で、重複しない引用符で囲っての文字列リテラルとなっている。
1| 'we'
2| ' |egrep "[MJ]"'
ただし、もとの文字列の 'we' の「'」はつけ直す必要がある。あとは、配列インデックスが奇数のときに、そのさらに外側を「'」には「"」で、「"」には「'」で囲んでやればいい! *2
先頭にteratermマクロ関数の「send」と、最後にLFの#10も加えてTTLマクロになった結果は、
send 'echo "$MJ" |grep '
send "'we'"
send ' |egrep "[MJ]"'
send #10
デモはTTLマクロメーカー
ソースのサンプル。先にあるのが「'」なら「"」を、「"」なら「'」を返すような関数を用意しておいて、
function qType(s){配列で回す。
var sq = s.indexOf("'");
var dq = s.indexOf('"');
if((sq == -1)&&(dq == -1)) return "'";
if(sq == -1) return "'";
if(dq == -1) return '"';
if(sq < dq) return '"';
}
var q = qType(s);
var array_s = s.split(q);
var qq = (q =="'") ? '"' : "'";
for(var k=0; k < array_s ; k++){
if(!array_s[k]) continue;
if(k % 2 == 0) rep +='send '+q+ array_s[k] +q+"\r\n";
else rep +='send '+qq+q+ array_s[k] +q+qq+"\r\n";
}
rep += 'send #10;
*2: シェルでそういう使い方が必要な時があるとするならば、行の最初に見つかった引用符が後ろでネストして使われているとだめ。たとえば、「echo "$MJ" |grep 'a"$b"c'」