目标是从文件中删除不包含一个大写字母、一个小写字母、一个特殊字符和一个数字的每一行。
我无法运行这个正则表达式:
(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$
如 bash 命令中所示:
sed -ri '\/(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$\/!d' rh.txt
由于错误是:
sed: -e expression #1, char 67: unterminated address regex
我不确定要逃避什么。
这里有什么帮助吗?
答案1
不要用于sed
此目的;使用逆grep
.这样你就可以使用你试图塞进的 PCRE 风格的表达式sed
(它不讲 PCRE):
grep -v -P '^(?=.*pattern1)(?=.*pattern2)'
答案2
由于转义斜杠而出现的错误/
,使得/
不再是地址模式的分隔符。
现在,即使您不转义/
,您的正则表达式也不会起作用。sed
仅支持BRE
,并且ERE
在某些实现中(并且将成为下一个 POSIX 版本中的标准)。BRE
或者ERE
不支持您在正则表达式中使用的前瞻功能(?=...)
。
归档您的需求:
LC_ALL=C sed -e '
/[A-Z]/!d
/[a-z]/!d
/[0-9]/!d
/[#?!@$%^&*-]/!d
' <file
答案3
可能的解决方案使用sed
:
sed -n '/[A-Z]/{/[a-z]/{/[0-9]/{/[#?!@$%^&*-]/p}}}'