[英]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.