echo "223255/12345678 " | grep '[0-9a-zA-Z/\-\?:\(\)\.,"\+]{1,34}'
正規表現によっては、順序に関係なく0-9 a-z A-Z / - ? : ( ) . , " +
最大34文字を含めることができます。私は正しいですか?
この場合、エコー値を印刷しないのはなぜですか?
答え1
コードにはいくつかの問題があります。
- 内部的に
[...]
唯一の特殊文字は-
and]
([:
文字クラスも導入されていますが)であり、これをエスケープする方法はwithではなくfor\
リストの最初または最後の文字にし、forを最初またはリスト-
の最後の文字([-...]
または[...-]
)]
の最初の文字([]...]
)です。上記は、\-\
範囲内のすべての文字を意味します。つまり、含まれていますが含まれていません。だからあなたが必要です。\
\
\
-
[-0-9a-zA-Z/?:().,"+]
a-z
範囲はロケールA-Z
によって異なります(é、ŝ...などを含めることができます)、マルチバイト文字も含めることができます。この範囲でASCII文字のみを希望する場合は、ロケールをCに変更する必要があります。... | LC_ALL=C grep ...
{x,y}
拡張正規表現演算子です(でサポートされていますgrep -E
)。対応する基本正規表現(でサポートgrep
)演算子はです\{x,y\}
。だからLC_ALL=C grep '[-0-9a-zA-Z/?:().,"+]\{1,34\}'
- でどこにでも一致することを確認してください
grep pattern
。grep
pattern
~へ1行ずつ入力してください。合わせたいなら全体的に、あなたは-x
(について精密^
)またはregexp演算子を使用して、開始と終了にパターンを固定します$
。 1から34までのシーケンスを含む行には1も含まれ、1のシーケンスを含む行は正規表現と一致するため同じgrep -E 'x{1,34}'
です。grep x
x
x
x
x
x{1,34}
- これを行うと仮定すると、たとえば、一部は空の文字列に変わり、他の部分は改行文字に変わる
echo "$var" | grep the-pattern
ため、信頼できないことに注意してください。また、入力全体ではなく入力の各行が一致するため、改行が含まれている場合はチェックが無効になる可能性があります。代わりに、ksh93、zsh、またはbash演算子を使用することをお勧めします。echo
-neen
\n
grep
$var
expr
[[ $var =~ pattern ]]
$var
要約すると、1〜34文字のASCII文字で構成されていることを確認するには、次のように書く必要があります。
if LC_ALL=C expr "x$var" : 'x[-0-9a-zA-Z/?:().,"+]\{1,34\}$' > /dev/null; then
echo yes
else
echo no
fi
(正規表現演算子expr
があるように、暗黙的にパターンを先頭に固定します。)^
答え2
次の場所にフラグを使用またはegrep
転送してみてください。-E
grep
echo "223255/12345678 " | egrep '[0-9a-zA-Z/\-\?:\(\)\.,"\+]{1,34}'
または
echo "223255/12345678 " | grep -E '[0-9a-zA-Z/\-\?:\(\)\.,"\+]{1,34}'
答え3
たぶんエスケープ/
文字が…役に立つのでしょうか(\)
?しかし、一重引用符の中にあるので、その中に入れたすべてをエスケープ処理する必要はないようです。
私のデバッグ提案は、いくつかの文字を削除し、パターンにどのような問題があるかを確認することです。