在 Solaris 上使用替代方法的 sed 正则表达式不起作用

sed regex with alternative on Solaris doesn't work

目前我正在尝试在 Solaris 上使用 sed 和正则表达式,但它不起作用。 我只需要显示与我的正则表达式匹配的行。

sed -n -E '/^[a-zA-Z0-9]*$|^a_[a-zA-Z0-9]*$/p'

输入文件:

grtad
a_pitr
_aupa
a__as
baman
12353
ai345
ki_ag
-MXx2
!!!23
+_)@*

我只想显示与上述正则表达式匹配的行:

grtad
a_pitr
baman
12353
ai345

还有其他方法可以使用alternative吗?在perl中有可能吗? 感谢您提供任何解决方案。

使用 Perl

perl -ne 'print if /^(a_)?[a-zA-Z0-9]*$/' input.txt

(a_)? 匹配 a_ 一次或零次,因此可选。它可能存在也可能不存在。

(a_)捕获匹配,什么都不需要。所以你可以使用 (?:a_)? 代替。 ?: 使 () 仅对内部内容进行分组(因此 ? 适用于整个事物),但不记得它。

grep

$ grep -xiE '(a_)?[a-z0-9]*' ip.txt
grtad
a_pitr
baman
12353
ai345
  • -x 匹配整行
  • -i 忽略大小写
  • -E 扩展正则表达式,如果不可用,请使用 grep -xi '\(a_\)\?[a-z0-9]*'
  • (a_)? 零次或一次匹配 a_
  • [a-z0-9]* 零个或多个字母或数字


随着 sed

sed -nE '/^(a_)?[a-zA-Z0-9]*$/p' ip.txt

或者,使用 GNU sed

sed -nE '/^(a_)?[a-z0-9]*$/Ip' ip.txt