- ベストアンサー
正規表現でBシェルの文字列チェック方法
- Bシェルで正規表現を使用して文字列の中に英数大文字、小文字、コンマ、ピリオド、アンダーバー、ハイフン以外の文字が含まれているかをチェックする方法を教えてください。
- if expr "$LINE" : [^a-zA-Z0-9\,\.\_\-] >/dev/null ; then echo "チェックNG 使用不可能な文字が入っています。 ${LINE}" >> ${LOG_FILE} else echo "チェックOK ${LINE}" >> ${LOG_FILE} fi
- 上記の方法では、文字列の先頭にある場合はチェックできますが、中にある場合はチェックできません。どのように修正すれば良いでしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
「以外」を調べるよりも、文字列が指定の文字だけで始めから終りまで構成されている事を確認する方が簡単かと思われます。 if expr "$LINE" : "^[A-z0-9,._-]*$" > /dev/null; then echo "OK" ... でどうでしょうか。
その他の回答 (3)
- sakusaker7
- ベストアンサー率62% (800/1280)
お使いのシステムは具体的になんでしょうか? 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 でひとつの単語ですので、ここでは「基本的な」 と訳してはいけません。 それともうひとつ。[] の中では . は\を前置する必要はないですよ。 , や_ は元からメタ文字ではないのでこれにも不要です。 - については微妙ですが、閉じのブラケットの直前に置けば\は不必要です。
お礼
sakusaker7さんご回答ありがとうございます。 []の中では前置しなくていいんですね。了解しました。 「^」の件はよく分からないのであきらめます。ありがとうございました。
- umota
- ベストアンサー率46% (150/324)
if expr "$LINE" : .*[^a-zA-Z0-9\,\.\_\-] ... としてはいかがでしょう。 # 正規表現の先頭に ".*" を付ける。
- SAYKA
- ベストアンサー率34% (944/2776)
>^a-zA-Z0-9\\,\\.\\_\\- \で\がエスケープされて・・・ ってオチでは?
お礼
「\」は投稿した際に2つになったみたいです。 実ソース上は「\」は一つです。
お礼
ご回答ありがとうございます。 「^」を前に出してやってみたのですが、以下のようなエラーが表示されてしまいます。実行結果は期待通りっぽいのですが、このエラーは無視してもよいのでしょうか?ご教授お願いいたします。 expr: 警告: 可搬でない BRE: `^[a-zA-Z0-9\,\.\_\-]*$': 基本的な正規表現の最初の文字として `^' を使うことは可搬ではないので無視します
補足
「^」を削除したらエラーがなくなりました。また期待通りに動きました。ありがとうございました。