繁体   English   中英

如何在比赛位置之后提取子字符串?

[英]How can I extract a substring after a match position?

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

我知道我可以使用grep (或其他工具)匹配包含特定模式的行,但是一旦有了这些行,如何提取该行的一部分? 我想用模式加上该模式前后大约200个字符来抓取行的一部分。 我对使用...(提供的工具或您在这里熟悉的语言)的答案特别感兴趣。

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

/.{200}aaa.{200}/

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

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

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

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

产生:

def ghi jkl

(.{0,200}(pattern).{0,200})或其他内容?

这是您想要的(在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;
}

我认为我可以通过匹配所需字符串的一部分,然后将匹配位置用作子字符串提取的起点来解决该问题。 在Perl中,一旦您的正则表达式成功,内置的pos告诉您停止的位置:

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

我倾向于用Perl编写程序,而不是使用正则表达式执行所有操作。 在这种情况下,Perl没有什么特别的。

我认为这可能是每个人都在思考的更基本的方法,如果我错了,请纠正我...您要除字符串之外的字符串之前之后打印吗?

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

这将打印如下内容:

在ASDF之前

在ASDF之后

根据您的需要进行更改,删除“ \\ n”和/或“ Before ...”和“ After ...”注释

是否要禁止文件中的字符串? 这将用空格替换字符串,再次将其更改为所需的字符串。

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

高温超导

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM