パイプで区切られた [[:alnum:]]* リストの正規表現

パイプで区切られた [[:alnum:]]* リストの正規表現

[[:alnum:]]*変数にパイプで区切られた文字列を設定するための信頼できる正規表現は何ですか?正規表現は、変数が設定されていない場合もカバーする必要があります。

承認済み:

var="abc123|A1B2C3|sDsdSS|"
var="abc123|A1B2C3"
var="abc123"
var=""

たぶん、いくつかの冗長パイプも動作するかもしれません(私のサポートgrep)。

var="|||r44fDs||fe4REee|||"

入力ファイルから特定の行を除外するには、後でスクリプトでこの「var」リストを使用します。

grep -vE "^(${var}) " input > input.filtered

私の正規表現はスペースで区切られた特殊文字も返しますが、これは私には適していないようです。

$ echo -e "sfsfds|sfsf|sfdsf|||\ns@ds|fsfsf|fssfsdf|sfsdfdfs\nsdfsdfsfs\nafafafs sdfsfd dfsfsfs\n"|grep -E '([[:alnum:]]*\|*)*'
sfsfds|sfsf|sfdsf|||
s@ds|fsfsf|fssfsdf|sfsdfdfs
sdfsdfsfs
afafafs sdfsfd dfsfsfs

$

答え1

grep解決策:

サンプルinput.txt:

sfsfds|sfsf|sfdsf|||
s@ds|fsfsf|fssfsdf|sfsdfdfs
sdfsdfsfs
afafafs sdfsfd dfsfsfs

var='^[[:alnum:]]+[[:alnum:]\|]*$'
grep -E "$var" input.txt

出力:

sfsfds|sfsf|sfdsf|||
sdfsdfsfs

答え2

のみ:

grep -x '[[:alnum:]|]*'

つまり、ゼロ個以上のalnumまたは|-Eここでは正規表現を拡張する必要はありません。この構文は基本正規表現と拡張正規表現の両方に有効です(PCREと他のほとんどの正規表現、サポートされていない唯一の正規表現は[:alnum:]POSIX文字クラスです)。

欠けている唯一のものは、行内-xで一致するものを見つけるのではなく、正規表現が行全体で一致するように強制するオプションです。正規表現のネストが遠すぎます。|区切られたフィールドがnullでないことを望む場合は必須です。

grep -xE '[[:alnum:]]+(\|[[:alnum:]]+)*'

あまり明確ではありませんが、デフォルトのREを使用してこれを行うこともできます。

grep -x '[[:alnum:]]\{1,\}\(|[[:alnum:]]\{1,\}\)*'

答え3

これは働きます:

var='^[[:alnum:]|]*$'

関連情報