【问题标题】:Linux - Only find a pattern within a line, not the whole lineLinux - 只在一行中找到一个模式,而不是整行
【发布时间】:2014-04-04 23:35:59
【问题描述】:

我想使用正则表达式在文件中查找模式。该模式可能在一条线的中间,但我不想要整条线。我试过grep -a pattern file 但这会返回包含正则表达式的整行。以下是我正在尝试做的一个例子。有谁知道这样做的方法吗?

例子:

输入:AAAAAAAAAAAAAXxXxXxXxBananasyYyYyYyYBBBBBBBCCCCCC

正则表达式:Xx.*yY

输出:XxXxXxXxBananasyYyYyYyY

【问题讨论】:

标签: regex linux bash


【解决方案1】:

你很接近,你需要-o标志

grep -o 'Xx.*yY' <<<AAAAAAAAAAAAAXxXxXxXxBananasyYyYyYyYBBBBBBBCCCCCC
XxXxXxXxBananasyYyYyYyY

【讨论】:

  • 注意:-o 标志是非标准的,尽管它存在于 BSD 和 GNU 用户态系统中。
  • @JS웃 它可以在我在这里拥有的新构建的 FreeBSD 10 以及 OS X (Mavericks) 上使用,它在 grep 手册页的底部显示 BSD
  • @kojiro 对不起,我的错。我对-P 选项感到困惑。我很抱歉。我写了-o 选项并正在寻找-P
【解决方案2】:

使用-o 选项仅打印与正则表达式匹配的行部分

grep -o pattern file

【讨论】:

    【解决方案3】:

    除了grep -o(最简单的方法),还有其他几个选项:

    1. bash 中,不依赖grep 的任何特定实现:

      $ regex='Xx.*yY'
      $ [[ AAAAAAAAAAAAAXxXxXxXxBananasyYyYyYyYBBBBBBBCCCCCC =~ $regex ]]
      $ echo ${BASH_REMATCH[0]}
      XxXxXxXxBananasyYyYyYyY
      
    2. 使用expr,这有点笨拙(部分原因是正则表达式隐式锚定到字符串的开头),但由 POSIX 标准定义,因此它应该适用于任何 POSIX 平台,无论使用外壳。

      $ expr AAAAAAAAAAAAAXxXxXxXxBananasyYyYyYyYBBBBBBBCCCCCC : '[^X]*\(Xx.*yY\)'
      XxXxXxXxBananasyYyYyYyY
      

    【讨论】:

      猜你喜欢
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 2014-10-18
      • 2017-06-13
      • 2020-09-28
      • 2011-09-21
      • 1970-01-01
      相关资源
      最近更新 更多