Я искал много на САС. Я новичок в его использовании. Удалось сделать команду, которая удаляет блок текста между PATTERN-1 и PATTERN-2 (включая шаблоны) в большом (250 МБ +) текстовом файле.

Теперь у меня гораздо более сложная задача. Мне нужно найти шаблон в текстовом файле и удалить весь текст от строки ДО шаблона, до другой строки, соответствующей другому шаблону. Я приведу пример:

PATTERN-1 = '<connection'
PATTERN-2 = state="wreck"
PATTERN-3 = '</connection>'

Мне нужно искать PATTERN-2. IE: state = "wreck" Когда я нахожу PATTERN-2, мне нужно найти PREVIOUS PATTERN-1. Затем мне нужно удалить весь текст между PATTERN-1 и PATTERN-3 (что включает удаление PATTERN-2).

Так что, если мой текст:

<connection ...
... state="wreck" ...
</connection>

Я бы нашел все экземпляры state = "wreck" - и затем удалил все между <connection и </connection> (включая текст <connection и </connection>).

Спасибо. Надеюсь, это четкий вопрос.

1 ответ1

0

Вот способ, если вы можете использовать perl, это удаляет все блоки <connection...</connection> которые включают в себя state="wreck"

cat file.txt
blah blah
<connection ...
... state="wreck" ...
</connection>
blah blah
<connection ...
... state="wreck" ...
</connection>
blah blah
blah blah
<connection ...
... state="another" ...
</connection>
blah blah
<connection ...
... state="wreck" ...
</connection>
blah blah

perl -0 -pe 's#<connection(?:(?!</connection>).)*state="wreck"(?:(?!</connection>).)*</connection>##gs' file.txt
blah blah

blah blah

blah blah
blah blah
<connection ...
... state="another" ...
</connection>
blah blah

blah blah

Объяснение:

-0      # slurp mode, read the file as it has only 1 line
-pe     # print current line, execute the following instructions

Regex:

s#                      : substitute, regex delimiter
<connection             : literally
(?:                     : start non capture group
    (?!</connection>)   : negative lookahead, make sure we don't find </connection>
    .                   : any character, including newline because of the s flag
)*                      : group may appear 0 or more times
state="wreck"           : literally
(?:                     : start non capture group
    (?!</connection>)   : negative lookahead, make sure we don't find </connection>
    .                   : any character, including newline because of the s flag
)*                      : group may appear 0 or more times
</connection>           : literally
##gs                    : replace with empty string, global, dot match newline

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .