Linux - 只查找一行内的模式,而不是整行

时间:2014-04-04 23:35:59

标签: regex linux bash

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

示例:

输入:AAAAAAAAAAAAAXxXxXxXxBananasyYyYyYyYBBBBBBBCCCCCC

正则表达式:Xx.*yY

输出:XxXxXxXxBananasyYyYyYyY

3 个答案:

答案 0 :(得分:11)

你很亲密,你需要-o标志

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

答案 1 :(得分:5)

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

grep -o pattern file

答案 2 :(得分:1)

grep -o(最简单的方法)外,还有其他几种选择:

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

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

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