用于管道分隔的 [[: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:]|]*'

也就是说,任何 0 个或多个 alnums 或 的序列|。这里不需要扩展 ( -E) 正则表达式。该语法在基本和扩展正则表达式中都有效(PCRE 和大多数其他正则表达式,唯一可能不支持的就是[:alnum:]POSIX 字符类)。

您唯一缺少的是-x强制正则表达式在整个行上匹配的选项,而不是在行内查找匹配项。正则表达式嵌套太过分了。如果您希望|分隔字段非空,则需要它:

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

这也可以使用基本的 RE 来完成,尽管不太清晰:

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

答案3

这应该有效:

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

相关内容