Заменить несколько экземпляров одной строки только одним экземпляром?

350
Lee Lemur

Название говорит об этом, правда. В основном я пытаюсь сжать огромный файл журнала.

Notepad ++ и Regex (я немного знаю) могут удалить эти повторяющиеся строки, но проблема в том, что я не хочу, чтобы все они были удалены. Я хочу, чтобы один экземпляр остался, чтобы сохранить структуру / порядок сообщений журнала.

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

На данный момент, я думаю, Regex с большей вероятностью найдет ответ, но я все еще на той стадии, когда не знаю, какие инструменты доступны.

Редактировать:

Пример сообщений, которые у меня тысячи, но мне нужно увидеть только одно из них: (Я вижу тонны таких, потому что каждое устройство scsi хочет встроить свое собственное сообщение. Мне нужно только видеть, что это происходит, а не то, что это происходит каждому из них).

multipathd[4893]: 3600a098000badf6800005dfe5a8cd2cd: sdie - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005def5a8cd273: sdgq - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005df05a8cd27b: sdeq - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005df55a8cd2ec: sdgw - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005df05a8cd2c2: sdfk - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005dec5a8cd2a3: sdgm - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005df35a8cd292: sdfo - rdac checker reports path is down: ctlr is in startup sequence

Но я хочу видеть только

rdac checker reports path is down: ctlr is in startup sequence

0
`Название действительно говорит об этом. За исключением того, что название, по-видимому, вводит в заблуждение. Линии, которые вы там показали, не являются "одной и той же линией". Это уникальные строки с одинаковым последним количеством символов и слов. Вы можете получить полезный ответ, если точно определили, какие части линии необходимо проверить, а какие можно игнорировать. spoko 6 лет назад 0

1 ответ на вопрос

2
Toto

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

Обновление в соответствии с новым запросом:

  • Ctrl+H
  • Найти то, что: ^([^-]+- )(.+)(?:\R(?1)\2)+
  • Заменить: $2
  • проверить обернуть
  • проверьте регулярное выражение
  • НЕ ПРОВЕРИТЬ . matches newline
  • Replace all

Объяснение:

^ : beginning of line ( : start group 1 [^-]+- : 1 or more NOT dash,then a dash and a space ) : end group 1 ( : start group 2 .+ : 1 or more any character ) : end group 2 (?: : start non capture group  \R : any kind of linebreak (?1) : same pattern than group 1 (ie. "[^-]+- ") \2 : backreference to group 2 )+ : end non capture group, must appears 1 or more times. 

Замена:

$2 : content of group 2 

Результат для данного примера:

rdac checker reports path is down: ctlr is in startup sequence 

Если несколько экземпляров не являются последовательными, лучше написать сценарий на вашем любимом языке сценариев.

Вот Perl One-Liner, который делает эту работу:

perl -aE 'chomp;(undef,$x)=split(/-/,$_);next if exists $s{$x};$s{$x}=1;say$x' inputfile 
@LeeLemur: Да, вы можете. Toto 6 лет назад 0
Не могли бы вы предоставить им пример текста? Ни один из них не сработал для меня, и я немного поиграл с этим. Lee Lemur 6 лет назад 0
@LeeLemur: отредактируйте свой вопрос и добавьте несколько строк, извлеченных из вашего файла, и ожидаемый результат. Toto 6 лет назад 0
Я сделал это сейчас Lee Lemur 6 лет назад 0
@LeeLemur: Но ваши строки не идентичны. Каковы правила удаления нежелательных строк? Toto 6 лет назад 1
Извините, я просто использую ту часть, которая идентична, например, "rdac checker сообщает, что путь не работает". Я обновил свой пост сейчас, чтобы отразить это Lee Lemur 6 лет назад 0
Таким образом, вы хотите потерять все строки, которые заканчиваются `rdac checker сообщает, что путь не работает: ctlr находится в последовательности запуска`, и вместо них видите только эту фразу, один раз? В этом случае измените текст поиска @ Toto на `^. * (Путь проверки rdac сообщает, что путь вниз: ctlr находится в последовательности запуска) (?: \ R. * \ 1) +`, и все готово. Для этого одно сообщение об ошибке, по крайней мере. spoko 6 лет назад 1

Похожие вопросы