2009-09-28 2 views
1

У меня есть требование grep строки или шаблона (скажем, около 200 символов до и после строки или рисунка) из чрезвычайно длинного файла строки. Файл содержит потоки данных (данные о торговле на рынке), поступающие с удаленного сервера и добавляемые к этой строке файла.Как извлечь подстроку после позиции соответствия?

Я знаю, что я могу сопоставлять строки, содержащие определенный шаблон, используя grep (или другие инструменты), но как только у меня есть такие строки, как я могу извлечь часть строки? Я хочу захватить часть линии с рисунком плюс примерно 200 символов до и после шаблона. Меня особенно интересовали бы ответы, используя ... (инструменты снабжения или языки, которые вам здесь нравятся).

+5

Итак, какова ваша проблема, точно? – Thomas

+2

Рассказывая нам о вашем требовании и перечисляя все потенциальные инструменты (?), Даже не задавайте вопрос. Каковы данные? Каким выглядит шаблон? Что вы пробовали? – Telemachus

+0

Нужно скопировать строку (скажем, «ASDF») из t он линия, а также его окрестности. Надеюсь, я уточнил этот вопрос. – jtk

ответ

6

Если то, что вам нужно, это 200 символов до и после выражения плюс само выражение, то вы смотрите:

/.{200}aaa.{200}/ 

Если вам нужны снимки для каждого (что позволяет извлекать каждую часть в виде единица), то вы используете это регулярное выражение:

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

Да, это выглядит довольно хорошо – xxxxxxx

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; 
} 
+3

Мои поздравления, вы только что изобрели колесо! – xxxxxxx

+2

Есть ли функция, чтобы сделать это в стандартной библиотеке C? В библиотеке POSIX C? Если есть, лучшим вариантом является игнорировать мой ответ и использовать решение, предоставляемое библиотекой. [perl] [bash] [python] [php] [c] - очень много языковых тегов – pmg

4

Если ваш grep имеет -o то, что выведет на экран только соответствует части.

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

производит:

def ghi jkl 
+0

Nice и direct. – Telemachus

0

Я думаю, что я мог бы подойти к решению проблемы путем сопоставления часть строки, мне нужно, то, используя позицию матча в качестве отправной точки для извлечения подстроки. В Perl, как только ваш регулярные выражения suceeds, то pos встроенных говорят вам, где вы остановились:

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

Я стараюсь писать свои программы в Perl вместо того, чтобы делать все, что в регулярном выражении. В этом случае нет ничего особенного в Perl.

0

Я думаю, что это может быть более простым, что все думают, поправьте меня, если я ошибаюсь ... Вы хотите напечатать до и после Строки за исключением строковым?

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

Это будет печатать что-то вроде:

Перед ASDF блаблабла

После ASDF blablablabla

изменить его в соответствии с вашими потребностями, удалить "\ п" и или «До ...» и «После ..."Комментарии

Хотите Подавите строку из файла? Это заменит строку с пустым пространством, опять же, изменить его на то, что вам нужно.

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

НТН

Смежные вопросы