13

У меня есть файл с несколькими экземплярами Text_1 и Text1 и мне нужно заменить обе эти строки с Text_A и TextB соответственно.

В настоящее время я выполняю две функции Find и Replace для каждого файла, одна из которых находит Text_1 и заменяет его Text_A а другая - Text1 и заменяет TextB .

Есть ли способ сделать все это сразу, вместо того, чтобы дважды запустить "Найти и заменить"?

Я использую Dreamweaver CS3, но у меня также есть Notepad++, обычный Notepad, OO Writer, MS Word, если так будет проще. В идеале я мог бы сделать это в Dreamweaver или Notepad++, но я готов загрузить что-то еще, чтобы выполнить работу. Я бы предпочел не делать какие-либо вещи из командной строки или создавать командный файл (хотя я знаю об этом, я не понимаю этого на самом деле).

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

Я хочу запустить Find & Replace 1 раз в 1 документе, и я хочу, чтобы он выполнял ВСЕ из следующего в течение этого одного экземпляра Find & Replace:

  1. Найти Text_1 и заменить Text_A
  2. Найти Text1 и заменить на TextB

Я не пытаюсь найти и заменить несколько документов.

8 ответов8

19

Начиная с Notepad++ 6.0, на самом деле это возможно без сценариев, использующих следующую технику:

Найти: Текст_1 и заменить на: Текст_А

Найти: Text2 и заменить на: TextB

Найти: (Text_1)| (Text2)

Заменить: (?1Text_A)(?2TextB)

Общий синтаксис:

Find: (FindA)|(FindB)|(FindC)...

Replace: (?1ReplaceA)(?2ReplaceB)(?3ReplaceC)...

?1 относится к первой захваченной фразе и так далее.

Я получил это из следующего ответа:https://stackoverflow.com/a/16104946/287101

10

Посмотри на Седа. Вы можете легко достичь своей цели только с помощью одной командной строки

sed -e "s/Text_1/TextA/" -e "s/Text1/TextB/" <your_file.txt>your_file_new.txt

2

Используя Notepad++, вы можете

  • Откройте все файлы, содержащие слова, которые вы хотите заменить, и используйте функцию поиска / замены во всех открытых файлах.

  • Используйте Find / Replace в файлах

  • Запишите макрос, выполняющий параметры поиска и замены, и воспроизведите его

2

Вам лучше запустить Find & Replace дважды, потому что у вас происходит две разные замены. Тем не менее, должно быть очень мало компромисса во времени обработки. Учтите следующее:

Запуск поиска и замены один раз, поиск по термину:

Get Term
  Does term match?  If so, replace term
Get Next Term
...

В целях выполнения мы предположим, что он линейный, и скажем, что он выполняется за время O(n).

Вы хотите найти два разных термина. Запуск Find & Replace дважды выглядит так:

Get Term
  Does term match?  If so, replace term
Get Next Term
...

Get Term
  Does term match?  If so, replace term
Get Next Term
...

что заняло бы O(2x1n) времени или вдвое больше времени, чем поиск одного термина.

Поиск двух терминов с двумя заменами теоретически будет выглядеть так:

Get Term
  Does first term match?  If so, replace first term
  Does second term match?  If so, replace second term
Get Next Term
...

Получение терминов не требует такой большой вычислительной мощности, поэтому, по сути, вы ищите два набора запросов для каждого термина, давая время O(1x2n), выполняя один раз, но выполняя поиск двух терминов.

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

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ ЗА ПРОГРАММИСТОВ: Это обобщенный пример. Я знаю, что это лучше, но я пытаюсь показать, почему эта функция не найдена.

0

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

0

Также это можно сделать с помощью плагина ActiveX (для Notepad++) и с помощью специального скрипта:

NppApplication.activeEditor.text
=NppApplication.activeEditor.text
.replace(/Text_1/g,"Text_A")
.replace(/Text1/g,"TextB")
0

Поддержка регулярных выражений в Notepad++ строго ограничена. Без оператора чередования нет надежды даже приблизиться к тому, что вы хотите сделать. Вам нужно будет использовать sed или редактор, который имеет лучшую поддержку регулярных выражений.

Обычно используемые расширения GNU для синтаксиса регулярных выражений включают в себя:

  • ? оператор, означающий ноль или единственный в своем роде;
  • | оператор чередования («foo | bar» соответствует "foo" или "bar")
  • модификаторы, такие как /g для жадных или /i для нечувствительных к регистру;
  • {a, b} для обозначения между токенами a и b вида.
  • (шаблон)+ к одному или нескольким совпадениям одного и того же шаблона

Компонент Scitilla, лежащий в основе Notepad++, строго POSIX-совместим и не распознает эти расширения. Вы можете обратиться к Регулярным выражениям для полного изложения и некоторых примеров

Источник

Смотрите также

GNUWin32 sed для Windows

-1

Это работает для всех номеров (чтобы удалить все номера из текста / статьи)

  1. Нажмите Ctrl+H, чтобы открыть диалоговое окно "Найти и заменить".

  2. В поле "Найти что" введите ^ #

  3. Оставьте поле "Заменить на" пустым.

  4. Заменить все.

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