为bash转义正则表达式sed(1个小写字母,1个大写字母,1个符号,1个数字)

为bash转义正则表达式sed(1个小写字母,1个大写字母,1个符号,1个数字)

目标是从文件中删除不包含一个大写字母、一个小写字母、一个特殊字符和一个数字的每一行。

我无法运行这个正则表达式:

(?=.*?[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}}}'

相关内容