如何在匹配位置后提取子字符串?

时间:2009-09-28 10:57:59

标签: regex string

我要求从极长的行ed文件中grep字符串或模式(比如在字符串或模式之前和之后约200个字符)。该文件包含来自远程服务器的数据流(市场交易数据),并附加到该文件的这一行。

我知道我可以使用grep(或其他工具)匹配包含特定模式的线条,但是一旦我有这样的线条,我该如何提取线条的一部分?我想抓住线条的一部分,加上图案前后大约200个字符。我会对使用...的答案特别感兴趣(提供你喜欢的工具或语言)。

6 个答案:

答案 0 :(得分:6)

如果您需要的是表达式之前和之后的200个字符加上表达式本身,那么您正在查看:

/.{200}aaa.{200}/

如果您需要捕获每个(允许您将每个部分作为一个单元提取),那么您使用此正则表达式:

/(.{200})(aaa)(.{200})/

答案 1 :(得分:4)

如果您的grep-o,则只输出匹配的部分。

 echo "abc def ghi jkl mno pqr" | egrep -o ".{4}ghi.{4}"

产生

def ghi jkl

答案 2 :(得分:1)

(.{0,200}(pattern).{0,200})还是什么?

答案 3 :(得分:1)

这是你想要的(在C中)? 如果是,请随意适应您的特定需求。

#include <stdio.h>
#include <string.h>

void prt_grep(const char *haystack, const char *needle, int padding) {
  char *ptr, *start, *finish;
  ptr = strstr(haystack, needle);
  if (!ptr) return;
  start = (ptr - padding);
  if (start < haystack) start = haystack;
  finish = ptr + strlen(needle) + padding;
  if (finish > haystack + strlen(haystack)) finish = haystack + strlen(haystack);
  for (ptr = start; ptr < finish; ptr++) putchar(*ptr);
}

int main(void) {
  const char *longline = "123456789 ASDF 123456789";
  const char *pattern = "ASDF";

  prt_grep(longline, pattern, 5); /* you want 200 */
  return 0;
}

答案 4 :(得分:0)

我想我可能会通过匹配我需要的字符串部分来解决问题,然后使用匹配位置作为子字符串提取的起始点。在Perl中,一旦你的正则表达式成功,pos内置函数会告诉你中断的地方:

 if( $long_string = m/$regex/ ) {
      $substring = substr( $long_string, pos( $long_string ), 200 );
      }

我倾向于用Perl编写程序,而不是在正则表达式中编写所有内容。在这种情况下,Perl并没有什么特别之处。

答案 5 :(得分:0)

我认为这可能是每个人都在想的更基本的,如果我错了就纠正我...... 您要打印之前 之后 字符串 字符串

awk -F "ASDF" '{print "Before ASDF" $1 "\n" "After ASDF" $2}' $FILE

这将打印如下内容:

  

在ASDF blablabla之前

     

ASDF blablablabla

之后

更改它以符合您的需要,删除“\ n”和/或“之前...”和“之后...”评论

你想从文件 supress 字符串吗? 这将用空格替换字符串,再次将其更改为您需要的任何内容。

sed -i 's/ASDF/\ /' longstring.txt

HTH