[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:34213] Re: 全角文字の判定方法



山下 純司です。

>>>>> Tomoo == Tomoo Nomura wrote:

Tomoo> YAMASHITA Junji (山下 純司) 様
Tomoo> 御回答ありがとうございます。

>>> - ch=`echo "$val" | sed --silint 's/.*[^-!@#$%^&*()_+={}:;<>[,.?/"].*/A/p'
>>> 
>> + ch=$(echo "$val" | sed --silint 's/.*[^]!@#$%^&*()_+={}:;<>[,.?/\"'"'\`"'-].*/A/p')
>> 
>> 
Tomoo> 1. - は最初のみならず最後に書けるということですか?
(snip)

man:regex(5) より。

       文字 `]' そのものをリストに入れたい場合は、最初の文字として指定
       すれば良い (`^' の後に続けるのでも良い)。文字 `-' そのものをリ
       ストに入れたい 場合 は、最初か最後の文字とすれば良い。


Tomoo> \"'"'\`"' がよくわかりません。

Tomoo> この中に " ' ` \ が書かれているわけですね。解説願えませんか?

ちょっとだけ勘違いされているに思えます。

man:bash(1)

       シングルクォートで文字を囲むと、クォート内部のそれぞれの文字は
       文字と して の値を保持します。シングルクォートの間にシングルクォー
       トを置くことはできません。これはバックスラッシュを前に付けても
       同じです。

ということで、シングルクォート内の \ は \ の意味しか持ちません。
また " も同様です。

ちょっと \" という文字の並びが紛らしかったですね。

ですので \"'"'\`"' の頭にある部分の \" は純粋に \ " の意味です。


これを踏まえて、説明します。

sed -e 's/....\"'"'\`"'.../A/p'
       A      xxABzzzBC       C     

この A 〜 C の式は シングルクォートで括られた A〜A と C〜C、ダブルクォー
トで括られた B〜B の 3つのクォートされた文字列から成っています。これが
どのように解釈されるかは

(FOO=foo; BAR=bar; ZOT=zot; echo '$FOO'"$BAR"'$ZOT')

を実行してみると雰囲気がつかめるでしょうか。
($FOObar$ZOT が表示されるはず)


A〜A にある xx部分は先に説明した通り、シングルクォート内部ですから
そのまま \ と " として解釈されます。
C〜C 部分はそのままです。

そしてダブルクォートで括った B〜B 内部にある zzz 部分で
' と ` (\ でエスケープ)を含めているわけです。


結果、Tomooさんの得たい文字列となるはずです。
ご理解いただけるでしょうか。


P.S.
私も試行錯誤してから、この表記でいけることを確認したのですが、
`...` を $(...) 置き換えたのは最後でした。
で、やはり抜けがあったのですが
$(...) を使う場合、' 内で ` を使ってもそのまま受け取られます。
なので

-> + ch=$(echo "$val" | sed --silint 's/.*[^]!@#$%^&*()_+={}:;<>[,.?/\"'"'\`"'-].*/A/p')
+> + ch=$(echo "$val" | sed --silint 's/.*[^]!@#$%^&*()_+={}:;<>[,.?/\"`'"'"'-].*/A/p')

で大丈夫だと思います。
(どっちにしても見辛いのですが)

-- 
山下 純司	mailto:ysjj@xxxxxxxxxxxx