Я не уверен, почему Perl здесь неприемлем. На предоставленных вами входных данных эта строка дает результат, который вы запрашивали:
perl -0777p -e 's/.* > (.*) joined the channel\.\n(((?!.* \1 (was kicked from channel\.|was banned from channel\.)\n).*\n)+?.*\1 disconnected)/\2/mg' irc.txt
Аргумент -e
- это в точности первый аргумент вашего magicregextool
, за исключением того, что я добавил / mg
модификатор регулярного выражения. Это не может быть «неизменным», но и не кажется необоснованным. Если вы не хотите вводить всю строку, как насчет этого сценария как magicregextool
:
#!/usr/bin/perl -0777p
BEGIN { $::arg = shift @ARGV; }
eval $arg;
Или даже:
#!/bin/sh
perl -0777pe $*
Затем вы просто набираете:
magicregextool 's/.* > (.*) joined the channel\.\n(((?!.* \1 (was kicked from channel\.|was banned from channel\.)\n).*\n)+?.*\1 disconnected)/\2/mg' irc.txt
Это то же самое, что и ваш образец (опять же, кроме добавления модификатора / mg
).
Дополнительным преимуществом этого является то, что если вы выполняете несколько связанных операций поиска / замены для каждого файла, вы можете объединить их в один сценарий:
#!/usr/bin/perl -0777p
s/.* > (.*) joined the channel\.\n(((?!.* \1 (was kicked from channel\.|was banned from channel\.)\n).*\n)+?.*\1 disconnected)/\2/mg;
s/(some other\n)matched text/\1/mg;