正規表現でBシェルの文字列チェック方法

このQ&Aのポイント
  • Bシェルで正規表現を使用して文字列の中に英数大文字、小文字、コンマ、ピリオド、アンダーバー、ハイフン以外の文字が含まれているかをチェックする方法を教えてください。
  • if expr "$LINE" : [^a-zA-Z0-9\,\.\_\-] >/dev/null ; then echo "チェックNG 使用不可能な文字が入っています。 ${LINE}" >> ${LOG_FILE} else echo "チェックOK ${LINE}" >> ${LOG_FILE} fi
  • 上記の方法では、文字列の先頭にある場合はチェックできますが、中にある場合はチェックできません。どのように修正すれば良いでしょうか。
回答を見る
  • ベストアンサー

正規表現 Bシェル

Bシェルの正規表現を教えてください。 ある文字列の中に英数大文字、小文字、コンマ、ピリオド、アンダーバー、ハイフン以外が含まれていないかをチェックしたいです。以下のようにすると文字列LINEの先頭にあるとチェックできるのに、中にあると出来ません。教えてください。 if expr \"$LINE\" : [^a-zA-Z0-9\\,\\.\\_\\-] >/dev/null ; then echo \"チェックNG 使用不可能な文字が入っています。 ${LINE}\" >> ${LOG_FILE} else echo \"チェックOK ${LINE}\" >> ${LOG_FILE} fi

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

「以外」を調べるよりも、文字列が指定の文字だけで始めから終りまで構成されている事を確認する方が簡単かと思われます。 if expr "$LINE" : "^[A-z0-9,._-]*$" > /dev/null; then echo "OK" ... でどうでしょうか。

heppocose
質問者

お礼

ご回答ありがとうございます。 「^」を前に出してやってみたのですが、以下のようなエラーが表示されてしまいます。実行結果は期待通りっぽいのですが、このエラーは無視してもよいのでしょうか?ご教授お願いいたします。 expr: 警告: 可搬でない BRE: `^[a-zA-Z0-9\,\.\_\-]*$': 基本的な正規表現の最初の文字として `^' を使うことは可搬ではないので無視します

heppocose
質問者

補足

「^」を削除したらエラーがなくなりました。また期待通りに動きました。ありがとうございました。

その他の回答 (3)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

お使いのシステムは具体的になんでしょうか? http://opengroup.org/onlinepubs/007908775/xbd/re.html#tag_007_003_008 にある仕様から考えても、 Regular Expressions " BRE Expression Anchoring A BRE can be limited to matching strings that begin or end a line; this is called anchoring. The circumflex and dollar sign special characters will be considered BRE anchors in the following contexts: 1. A circumflex (^) is an anchor when used as the first character of an entire BRE. The implementation may treat circumflex as an anchor when used as the first character of a subexpression. The circumflex will anchor the expression (or optionally subexpression) to the beginning of a string; only sequences starting at the first character of a string will be matched by the BRE. For example, the BRE ^ab matches ab in the string abcdef, but fails to match in the string cdefab. The BRE \(^ab\) may match the former string. A portable BRE must escape a leading circumflex in a subexpression to match a literal circumflex. 3. A BRE anchored by both "^" and "$" matches only an entire string. For example, the BRE ^abcdef$ matches strings consisting only of abcdef. " 先頭に ^ を置くことが可搬性を損なうとは思えないのですが。 警告のメッセージを使って検索してみると、 http://japo.sourceforge.jp/trans/ja/sh-utils-2.0d.ja.po などで #: src/expr.c:439 #, c-format msgid "" "warning: unportable BRE: `%s': using `^' as the first character\n" "of the basic regular expression is not portable; it is being ignored" msgstr "" "警告: 可搬でない BRE: `%s': 基本的な正規表現の最初の文字として\n" "`^' を使うことは可搬ではないので無視します" というのが見つかりますが、GNU の expr はこれに該当しませんし。 ところで「基本的な正規表現の」というのは誤訳ですね。 basic regular expression でひとつの単語ですので、ここでは「基本的な」 と訳してはいけません。 それともうひとつ。[] の中では . は\を前置する必要はないですよ。 , や_ は元からメタ文字ではないのでこれにも不要です。 - については微妙ですが、閉じのブラケットの直前に置けば\は不必要です。

heppocose
質問者

お礼

sakusaker7さんご回答ありがとうございます。 []の中では前置しなくていいんですね。了解しました。 「^」の件はよく分からないのであきらめます。ありがとうございました。

  • umota
  • ベストアンサー率46% (150/324)
回答No.3

if expr "$LINE" : .*[^a-zA-Z0-9\,\.\_\-] ... としてはいかがでしょう。 # 正規表現の先頭に ".*" を付ける。

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

>^a-zA-Z0-9\\,\\.\\_\\- \で\がエスケープされて・・・ ってオチでは?

heppocose
質問者

お礼

「\」は投稿した際に2つになったみたいです。 実ソース上は「\」は一つです。

関連するQ&A

  • 正規表現の記載方法

    どなたかお知恵をお貸し下さい。 PHPの正規表現で、 6文字以上20文字以下 英数字 -(ハイフン _(アンダーバー) ,(カンマ) .(ピリオド) 最初の1文字目はアルファベット というものを表現したいです。 お知恵をお貸し下さい。 お願いいたします。

    • ベストアンサー
    • PHP
  • シェルについて

    シェルの作成方法がわかりませんので教えてください。 シェルを実行することにより、 secureログファイルの「disconnect」という文字列を待ちます。 「disconnect」という文字列が出力されたら、 別のシェルを実行するというシェルを作成したいと考えています。 1.このようなシェルは作成することが可能でしょうか?   もし、可能でしたら例文を書いて頂ければ幸いです。 2.別のシェルを実行した後、   当初の「disconnect」という文字列を待つ状態に戻りと思いますが、可能でしょうか?   もし、可能でしたら例文を書いて頂ければ幸いです。 どうぞよろしくお願いします。

  • シェル ファイルの中身によって特定の処理

    シェルスクリプトに関する質問です。 少しシェルで言語風なものを作ってみようと思い、作成したのですが、上手くいかないので質問させて頂きました。内容は、特定の文字がファイルに記載されているか判定して、 特定の文字だったら処理をするというものです。 現在、このようなソースになっています↓ #!/bin/sh - #ファイルを設定(仮) file_name="dummy.sh" #行数を変数へ格納 line=$(wc -l ${file_name}) #行数をlog.txtへ書き込む echo ${line} > log.txt #行数以外にファイル名があるので削除 sed -i "s/$file_name//g" log.txt #行数を格納 Line=$(cat log.txt) i=0 #全ての行を変数へ格納 #ここが問題 配列に変数が使えない!? while [ $i = ${Line} ] do array[$i]=$(sed -n "${i}p" ${file_name}) expr `${i} + 1` done # 格納した変数をチェックして、 # 指定された文字(hello)が書かれていればhelloと表示させる b=0 while [ $b = ${main_file} ] do if [ array[$b] = "hello" ] then echo "hello" fi expr `$b + 1` done ここで、配列を利用し、変数への代入が出来ませんでした。 ただ、エラーは表示されません。。。 環境はUbuntu10.10です。 何もいじっていないので、たぶん大丈夫だと思うんですが・・・ 何か解決策はありませんか? また、コレよりいい方法などがあればぜひ教えてください。

  • 半角英数字の正規表現でドット(.)がはじかれない

    Javascriptのmatchでファイル名の使用可能文字のチェックを行っています。 使用可能文字は漢字、全角ひらがな、カタカナ、半角英数字、ハイフン(-)、 アンダーバー(_)で以下のように書いています。 if ( filename.match(/[^\u30a0-\u30ff\u3040-\u309f\u30e0-\u9fcf\0-9a-zA-Z\-\_]/) ){ alart(NG) // 使用可能文字以外が含まれている } else{ alart(OK) // 使用可能文字だけ } ファイル名が「ひらがな-カタ_漢字1a」はOK、「ひらが.な-カタ_漢字1a」はNG としたいのですが両方OKになってしまいます。 どうやら半角英数字の「0-9a-zA-Z」を条件に入れることでドット(.)も使用可能文字 とされてしまうみたいです。 「0-9a-zA-Z」を外すと「ひらが.な-カタ_漢字1a」はNG判定になります。 なぜこのようになるのか教えて下さい。

    • ベストアンサー
    • Java
  • Javascriptでのドット(.)正規表現につい

    Javascriptで入力したファイル名に禁止文字がないかmatchを使って確認しようと しています。 ファイル名にドット(.)があったらエラーにしたいのですが、ファイル名末尾に ドット(.)があった場合はちゃんとチェックしてくれますが、ファイル名の真ん中に ドット(.)があった場合はチェックされません「\\.」としてますがなにがいけない のでしょうか。 また、漢字、全角ひらがな、カタカナ、半角英数字、ハイフン(-)、アンダーバー(_) のチェックもしたいのですが条件が多くて複雑化して見栄えが悪いです。 上手くすっきり書く方法はないのでしょうか。 よろしくお願いします。

  • シェルスクリプト

    2月14日頃質問のあった”UNIXのシェルスクリプトを使用してテキストファイルのある列にある特定の文字列を条件としてその行を出力するということをやりたい”を下記のように作ってみました。問題ないか逆質問の形で投稿します。(ルール違反かもしれませんが質問が締め切られているので・・・) #!/bin/bash CAT=YAHOO while read LINE do echo $LINE > tmp.txt DOG=`cut -d" " -f2 tmp.txt` if [ "$CAT" = "$DOG" ] then echo "$LINE" fi done < catalog.file

  • 正規表現

    質問させていただきます。 文字コード「Shift-JIS」で渡ってきた文字列を 英字とスペースはOKで、 それ以外の文字列が入力されていたら、エラーいう処理を しているのですが、うまくいきません。 ご教授よろしくお願いします。 // 半角にする $kana = mb_convert_kana($_POST['kana'], "r"); if ((ereg("^[a-zA-Z]+$", trim($kana))) == false) {   echo "エラーです"; } 全角スペースと半角スペースと英字はOKで、それ以外はNG としたいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • [15]にマッチする正規表現

    [15]にマッチする正規表現 [15] にマッチする正規表現を書きたいのですが、うまくいきません。。。。 簡単だ、と思ったのですが。。。 expr "$DATA1" : .*\[15\].* と書くと、中の数字が15じゃなくてもマッチしてしまいます。 expr "$DATA1" : .*15.* であれば"15"にマッチしますが、対象の文字列の都合上、カッコでも識別する必要があり 困っております。[と]をエスケープする目的で\をつける、と思っているのですが、何か 思い違いをしているのでしょうか。

  • 正規表現

    正規表現で 数値と半角記号(!#$%()~|-^@[;],./`{+*}_)が入っているというものを表現したいのですが、、、 下記のような正規表現をすると、エラーになってしまいます。何かよい方法はありませんか? ^[a-zA-Z0-9\-_!#$%()~|-^@[;],./`{+*}_]*$ 又、携帯電話のチェックをしたいのですが、 1文字以上の文字列があってというような処理にしたいのですが、何かよい方法はないでしょうか? ereg( "@docomo\.ne\.jp$", $email )

    • ベストアンサー
    • PHP
  • [シェルスクリプト]ファイル変換後に空になる

    ubuntu ver9.04 上で以下のような連番(01~09)の付いたCSVファイルの4,5,11,12列目のフィールドを抜きだし区切り文字を","から空白に置き換え.datファイルにするというシェルプログラムを作っています. たまに一部のファイルが空で出力されます.(ファイルは出力されるのですが中身がない)なぜでしょうか? 誰かご教示願います. #!/bin/bash passB="./data/sw0174-h13-d0-" passA="0001" kaku=".csv" dat=".dat" #echo $passB # input file number echo 'Please input minimum file number (ex.03)!' read fnumin echo 'Please input maximum file number (ex.05)!' read fnumax delta=`expr $fnumax - $fnumin` echo "delta=" echo $delta cnt=0 while [ "$cnt" -le "$delta" ] do echo "cnt=" echo $cnt fpass=$passB$fnumin$passA$kaku echo $fpass cvtf=$passB$fnumin$passA$dat echo $cvtf cut -d ',' -f 4,5,11,12 $fpass > $cvtf cat $cvtf | sed -e 's/,/ /g' > $cvtf cnt=`expr $cnt + 1` fnumin=`expr $fnumin + 1` fnumin=0$fnumin echo "fnumin=" echo $fnumin done

専門家に質問してみよう