我要求从极长的行ed文件中grep字符串或模式(比如在字符串或模式之前和之后约200个字符)。该文件包含来自远程服务器的数据流(市场交易数据),并附加到该文件的这一行。
我知道我可以使用grep
(或其他工具)匹配包含特定模式的线条,但是一旦我有这样的线条,我该如何提取线条的一部分?我想抓住线条的一部分,加上图案前后大约200个字符。我会对使用...的答案特别感兴趣(提供你喜欢的工具或语言)。
答案 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)
我认为这可能是每个人都在想的更基本的,如果我错了就纠正我......
您要打印之前 之后 字符串 字符串
这将打印如下内容: 在ASDF blablabla之前 ASDF blablablabla 更改它以符合您的需要,删除“\ n”和/或“之前...”和“之后...”评论 你想从文件 supress 字符串吗?
这将用空格替换字符串,再次将其更改为您需要的任何内容。 HTH awk -F "ASDF" '{print "Before ASDF" $1 "\n" "After ASDF" $2}' $FILE
sed -i 's/ASDF/\ /' longstring.txt