[[: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:]|]*$'