Как я могу удалить текст до и после определенного символа?

Я пытался удалить текст до и после определенного символа в каждой строке текста. Это было бы очень трудно сделать вручную, так как он содержит 5000 строк, и мне нужно удалить текст перед этим ключевым словом в каждой строке. Любое программное обеспечение, которое могло бы это сделать, было бы прекрасно или любые Perl-скрипты, которые могли бы работать в Windows. Я запускаю Perl-скрипты в ActivePerl, поэтому скрипты, которые могут это делать и запускать на ActivePerl, будут полезны.

Спасибо

12.12.2008 11:26:46
Можно ли привести пример входной строки и выходной строки, которую вы хотите получить от нее? Ваш вопрос немного двусмысленный, и ответы, которые вы получили до сих пор, отражают это.
Adam Bellaire 12.12.2008 21:01:06
5 ОТВЕТОВ

Вам не нужно программное обеспечение, вы можете сделать эту часть вашего существующего сценария. Многострочное регулярное выражение замените по линиям / a (b) c /, тогда вы можете добавить обратный рефлекс b в заменителе с помощью $ 1. Не зная больше о тексте, с которым вы работаете, трудно угадать, каким будет реальный шаблон.

2
12.12.2008 11:32:30

Я бы сказал, что если $ text содержит весь ваш текст, вы можете сделать:

$text =~ s/^.*(keyword1|keyword2).*$/$1/m;

В mмодификаторов позволяет ^и $увидеть начало и окончание строки, а не начало и конец строки.

1
12.12.2008 11:34:45
Я думаю, что это не сработает, потому что .*$не будет соответствовать символам новой строки.
Leon Timmermans 12.12.2008 12:09:13
Конечно, он не будет соответствовать символам новой строки, это точка '/ m', разве не об этом спрашивали?
mat 12.12.2008 12:19:37
, будет соответствовать что угодно, кроме новой строки. $ будет соответствовать после новой строки или в конце строки. Если между ними есть новая строка (как обычно будет), она не будет совпадать.
Leon Timmermans 12.12.2008 12:34:23
Если вы хотите сопоставить символы новой строки, используйте соответствующий модификатор. Нет, важная персона.
slim 12.12.2008 13:19:12

Предполагая, что у вас есть следующее:

text1 text2 ключевое слово text3 text4 text5 ключевое слово text6 text7

и что вы хотите

s/.*?keyword(.*?)keyword.*/keyword$1keyword/;

в противном случае вы можете просто заменить всю строку ключевым словом

Пример данных может помочь нам быть более понятным

2
12.12.2008 18:52:03

Я бы использовал это:

$text =~ s/ .*? (keyword) .* /$1/gx;
3
12.12.2008 13:19:41

Предполагая, что вы хотите удалить весь текст слева от keyword1и весь текст справа от keyword2:

while (<>) {
  s/.*(keyword1)/$1/;
  s/(keyword2).*/$1/;
  print;
}

Поместите это в скрипт на Perl и запустите так:

fix.pl original.txt > new.txt

Или, если вы просто хотите сделать это на месте, возможно, для нескольких файлов одновременно:

perl -i.bak -pe 's/.*(keyword1)/$1/; s/(keyword2).*/$1/;' original.txt original2.txt

Это сделает редактирование на месте, переименовав оригинал в расширение .bak, используя неявный цикл while с print и выполнив поиск и замену шаблона перед каждой печатью.

Чтобы быть в безопасности, сначала проверьте его без опции -i или, по крайней мере, только для одного файла ...

0
12.12.2008 14:05:56