поиск и замена

Russian main discussion
  • Author
  • Message
Offline
Posts: 2
Joined: Fri Jan 11, 2019 7:27 am

Post by zeroberto »

YuS wrote:
zeroberto wrote: как выполнить автозамену
<div><img alt="" data-rich-file-id="цифра" src="

на

'![](
[v] Регулярные выражения

Code: Select all

что:<div><img alt=\"\" data-rich-file-id=\"\d{1,3}\" src=\"
чем:'![](
Спасибо. :)

Offline
Posts: 4
Joined: Fri Apr 20, 2018 2:54 am

Post by Azrailll »

Подскажите какую сточку в скрипте MultiReplace.js надо заменить, чтобы поиск был с помощью регулярных выражений. Вернее 1-й шаблон - обычный поиск, 2-й шаблон с помощью регулярок.

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

Azrailll
1. В подавляющем большинстве случаев ничего менять не надо.
2. Поиск в скрипте выполняется стандартным Akelpad-методом - "AkelPad.TextReplace":

Code: Select all

AkelPad.TextReplace(0, "FindIt1", "ReplaceWith1", 0x280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true); 
3. Описание метода найдёте в файле "..\AkelFiles\Docs\Scripts-Rus.txt"
4. В тех же случаях, где необходимо исключить обработку шаблона как регулярного выражения и принудить к обработке как "обычного текста", пересчитайте сумму флагов за минусом FRF_REGEXP (0x00080000 //FRF_REGEXP): 0x280001 --> 0x200001
5. Также желательно заменить в оригинальном скрипте последний аргумент в соответствии с актуальным синтаксисом: true --> 0x1
6. ИТОГО (1 - "обычный", 2 - RegExp):

Code: Select all

   AkelPad.TextReplace(0, "FindIt1", "ReplaceWith1", 0x200001 /*FRF_DOWN|FRF_BEGINNING*/, 0x1); 
   AkelPad.TextReplace(0, "FindIt2", "ReplaceWith2", 0x280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, 0x1); 

Offline
Posts: 4
Joined: Fri Apr 20, 2018 2:54 am

Post by Azrailll »

opk44 wrote:Azrailll
1. В подавляющем большинстве случаев ничего менять не надо.
2. Поиск в скрипте выполняется стандартным Akelpad-методом - "AkelPad.TextReplace":

Code: Select all

AkelPad.TextReplace(0, "FindIt1", "ReplaceWith1", 0x280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true); 
3. Описание метода найдёте в файле "..\AkelFiles\Docs\Scripts-Rus.txt"
4. В тех же случаях, где необходимо исключить обработку шаблона как регулярного выражения и принудить к обработке как "обычного текста", пересчитайте сумму флагов за минусом FRF_REGEXP (0x00080000 //FRF_REGEXP): 0x280001 --> 0x200001
5. Также желательно заменить в оригинальном скрипте последний аргумент в соответствии с актуальным синтаксисом: true --> 0x1
6. ИТОГО (1 - "обычный", 2 - RegExp):

Code: Select all

   AkelPad.TextReplace(0, "FindIt1", "ReplaceWith1", 0x200001 /*FRF_DOWN|FRF_BEGINNING*/, 0x1); 
   AkelPad.TextReplace(0, "FindIt2", "ReplaceWith2", 0x280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, 0x1); 
Спасибо за объяснение.
И еще вопрос: почему такое регулярное выражение "<p>(\n| )</p>\n" в скрипте не находит? (обычным поиском все нормально)

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

Azrailll wrote:И еще вопрос: почему такое регулярное выражение "<p>(\n| )</p>\n" в скрипте не находит? (обычным поиском все нормально)
Из-за ограничений, накладываемых JScript на символ "". Его, в данном случае, нужно экранировать (дублировать). Т. е. запись вашего выражения внутри скрипта должна выглядеть следующим образом:

Code: Select all

AkelPad.TextReplace(0, "<p>(\\n| )</p>\\n", "ReplaceWith3", 0x280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, 0x1); 

Offline
Posts: 4
Joined: Fri Apr 20, 2018 2:54 am

Post by Azrailll »

opk44 wrote:Из-за ограничений, накладываемых JScript на символ "". Его, в данном случае, нужно экранировать (дублировать).
opk44, Спасибо большое, а то я голову ломал.

Offline
Posts: 351
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

Azrailll
перед применением экранировать

Code: Select all

// sSelText = sSelText.replace(/[\]\[\{\}\(\)\*\+\?\.\^\$\|\=\<\>\#\\]/g, escaper);
sSelText = sSelText.replace(/[\\]/g, escaper); // экранировать 

function escaper(str) {
	return '\\' + str;
}
// или так наверно
sSelText = sSelText.replace("\\", "\\\\");

Offline
Posts: 4
Joined: Thu Apr 09, 2020 8:52 am

Поиск - в одной строке, замена в следующей

Post by wizpad »

Доброго дня! Прошу помощи новичку.
Есть текст, нужно найти ключевое словосочетание, потом перейти на следующую строку и заменить ее на свой текст.
А именно - ищем "нет на складе", и заменяем следующую строку (+1) на свой текст : <quantity>0</quantity>
Как это реализовать быстро и с помощью каких инструментов?

Code: Select all

	<item sku="2083669083193">
		<name>Electrolux EACS-07HF/N3 Fusion Нет на складе!!! нет в наличии</name>
		<quantity>4</quantity>
		<price>16888</price>
		<cat_id>536820868</cat_id>
	</item>
	<item sku="2210000011137">
		<name>Electrolux EACS-07HG-M/N3 Silver Белое стекло</name>
		<quantity>2</quantity>
		<price>14999</price>
		<cat_id>536820868</cat_id>
	</item>
	<item sku="2210000011878">
		<name>Electrolux EACS-07HLO/HF нет в наличии</name>
		<quantity>2</quantity>
		<price>11999</price>
		<cat_id>536820868</cat_id>
[/code]

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Re: Поиск - в одной строке, замена в следующей

Post by opk44 »

wizpad wrote:...найти ключевое словосочетание, потом перейти на следующую строку и заменить ее на свой текст.
А именно - ищем "нет на складе", и заменяем следующую строку (+1) на свой текст... : <quantity>0</quantity>
Как это реализовать быстро и с помощью каких инструментов?
Если версия редактора не совсем древняя, то можно и без инструментов.
Стандартный диалог замены
Что:

Code: Select all

(?-s)(^.*Нет на складе.*)(\n.*<quantity>)(\d+)(<\/quantity>)
Чем:

Code: Select all

\1\2\u0030\4
Опции: [v] Регулярные выражения

Оговорки и допущения:
1. Предполагается, что текущее количество выражено только в целых числах.
2. Меняется любое целое число внутри тега на ноль. При подстановке в качестве "нуля" использован "\u0030" чтобы не путаться в номерах обратных ссылок.
3. Можно отбросить четвертую группу (<\/quantity>) и соответствующую ей обратную ссылку (\4). 4. В первой группе поиск с начала строки также избыточен и его можно укоротить до (Нет на складе.*). Но на скорости это не должно особо отразиться.
5. Если исходить из желания максимально разгрузить первую часть (шаблон поиска), чтобы избежать возможных ошибок при его изменении, то взамен придётся "нагрузить" вторую часть замены:
Что:

Code: Select all

(?i-s)(нет на складе)(.*\n)(.*)
Чем:

Code: Select all

\1\2      <quantity>0</quantity>
Опции: [v] Регулярные выражения

Offline
Posts: 4
Joined: Thu Apr 09, 2020 8:52 am

Re: Поиск - в одной строке, замена в следующей

Post by wizpad »

opk44 wrote: Если версия редактора не совсем древняя, то можно и без инструментов.
Стандартный диалог замены
Благодарю! Оба варианты работают. На старой версии выдало ошибку, на свежей работает.
Возможно ли это все запустить из командной строки, чтобы подсунуть фаил и пройтись разными ключевыми словами?

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

wizpad
1. Для того, чтобы узнать "возможно ли", крайне полезно ознакомиться с документацией (раздел "Параметры командной строки"+"Ручные установки").
Данное чтение отлично "вострит ум и бодрит воображение".
2. На форуме работает поиск!
Среди 33 тысяч сообщений уже очень трудно не найти что-то или очень схожее или прямо идентичное практически любому "новому" вопросу.
Например....
3. На текущей (27-й) странице данной ветки только что в очередной раз обсуждался скрипт "MultiReplace.js". Затруднительно понять, каким образом вы этого не заметили.
4. Пункты 1+2+3 (документация+поиск+готовые решения) - это те самые "стандартные кирпичи" из которых строится практически любой "сарай" по индивидуальному проекту.

Offline
Posts: 4
Joined: Thu Apr 09, 2020 8:52 am

Post by wizpad »

opk44 wrote:wizpad
1. Для того, чтобы узнать "возможно ли", крайне полезно ознакомиться с документацией (раздел "Параметры командной строки"+"Ручные установки").
Смотрел. Для человека далекого от кодинга - тяжко осилить. Предполагал, что есть решение типа:
фаил.txt фаил сценария поиска и замены, сохранение.
Вероятно, тут сложнее чем bat фаил слепить
2. На форуме работает поиск!
Искал. Искомое решение отсутствует. Возможно, мне так повезло с запросом "из командной строки поиск и замена", но на вторую страницу результата поиска уже выдает ошибку http://akelpad.sourceforge.net/forum/se ... 1&start=15
3. На текущей (27-й) странице данной ветки только что в очередной раз обсуждался скрипт "MultiReplace.js". Затруднительно понять, каким образом вы этого не заметили.
Видел. Смотрел. К сожалению, применение к свое задаче не нашел. Где-то рядом, но развить самому не получилось
Всегда стараюсь разобраться самостоятельно, перед запросом о помощи. Но тут - пассую.
Вам еще раз - слова благодарности, что помогаете простым юзерам)))

Offline
Posts: 351
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

wizpad
Для множественной замены по сценарию могу предложить свою прогу TextReplace, обсудить можно тут

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

wizpad wrote:Смотрел. Для человека далекого от кодинга - тяжко осилить. Предполагал, что есть решение типа:
фаил.txt фаил сценария поиска и замены, сохранение.
Вероятно, тут сложнее чем bat фаил слепить
1. "Лепить" bat-файлы - это тоже разновидность кодинга, а сложность - понятие относительное. Но дело не в этом. Как говорилось в известном мультфильме "лучше день потерять, потом за пять минут долететь...Вперёд!".

2. test.bat

Code: Select all

AkelPad.exe /Show(0) "c:\File_In.txt" /Call("Scripts::Main", 2, "MultiReplace.js") /SaveFile("C:\File_Out.txt") /Quit
где

Code: Select all

/Show(0)
-- запустить в скрытом окне (см. \AkelFiles\Docs\AkelHelp-Rus.htm)

Code: Select all

"c:\File_In.txt"
-- файл на входе (открыть и обработать)

Code: Select all

/Call("Scripts::Main", 2, "MultiReplace.js")
-- запустить скрипт "MultiReplace.js" и дождаться его выполнения ("2") (см. "\AkelFiles\Docs\Scripts-Rus.txt")

Code: Select all

/SaveFile("C:\File_Out.txt")
-- результат обработки сохранить в выходной файл "C:\File_Out.txt"

Code: Select all

/Quit
-- закончить обработку и выйти

3. Ну и некоторые самоочевидные вещи:
файл скрипта можно и нужно переназвать, и оставить в нём только шаблоны замен (без цикла обхода вкладок)
после завершения этапа тестирования, но не ранее, можно "выходной" файл начать писать во "входной".

"Обжиг горшков" закончен.

Offline
Posts: 4
Joined: Thu Apr 09, 2020 8:52 am

Post by wizpad »

opk44 wrote: "Обжиг горшков" закончен.
Спасибо, получилось! Чувствую себя почти джидаем)))
Post Reply