【问题标题】:sed regex with alternative on Solaris doesn't worksed 正则表达式与 Solaris 上的替代方法不起作用
【发布时间】:2017-03-05 06:18:30
【问题描述】:

目前我正在尝试在 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

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

【问题讨论】:

  • 因为模式是互斥的,你可以写成:sed -n -e '/^a_[a-zA-Z0-9]*$/p;/^[a-zA-Z0-9]*$/p;'sed -n -e '/^a_[a-zA-Z0-9]*$/p;' -e '/^[a-zA-Z0-9]*$/p;'。注意如果只需要过滤,也可以使用grep。
  • sed -n -E '/^[a-zA-Z0-9]*$|^a_[a-zA-Z0-9]*$/p' 在 GNU sed 上为我工作,你到底是怎么失败的?

标签: regex bash perl sed solaris


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用 Perl

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

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

    (a_)捕获匹配,不需要什么。所以你可以改用(?:a_)??: 使 () 只对里面的内容进行分组(所以 ? 适用于整个事情),但不记得了。

    【讨论】:

      猜你喜欢
      • 2012-12-03
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 2014-09-03
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      相关资源
      最近更新 更多