Поиск и замена вопроса

Мне нужно найти все вхождения AAsomeArbitraryStringBB и заменить его CCsomeArbitraryStringDD .

Так

 AAHelloBB Text AAByeByeBB 

становится

 CCHelloDD Text CCByeByeDD. 

Важно отметить, что строка замены содержит часть строки поиска.

2 Solutions collect form web for “Поиск и замена вопроса”

Это основная задача для команды sed :

 sed 's/AA\(someArbitraryString\)BB/CC\1DD/g' 

В конце концов, если вы хотите сделать это для всех «произвольных строк»:

 sed 's/AA\(.*\)BB/CC\1DD/g' 
 sed "s/\([AB]\)\1\1*/\n&\n/g s/AA\n\([[:alnum:]]\{1,\}\)\nBB/CC\1DD/g s/\n//g " <<\INPUT AAHelloBB Text AAByeByeBB INPUT , sed "s/\([AB]\)\1\1*/\n&\n/g s/AA\n\([[:alnum:]]\{1,\}\)\nBB/CC\1DD/g s/\n//g " <<\INPUT AAHelloBB Text AAByeByeBB INPUT 

Я думаю, что нужно только заменить AA>>CC&&BB>>DD если между этими двумя группами есть один или несколько буквенно-цифровых символов [s], и они всегда должны сжимать возможные вхождения как можно ближе друг к другу.

Пример:

 CCHelloDD Text CCByeByeDD 

Трудная часть этого делается в первом операторе s/// ubstitution. Он помещает символ \n ewline в голову и хвост всех появлений AAA* и BBB* в пространстве шаблонов одновременно. Иногда разграничение может быть сложным – часто размещение разделителя на головном устройстве может меняться там, где должен идти конечный разделитель, или наоборот. Я стараюсь сделать этот шаг в единственной связи, когда это возможно, чтобы избежать необходимости редактировать редактирование.

Таким образом, мы рассмотрим это наизнанку, но, поскольку мы считаем, что sed просматривает пространство шаблонов слева направо для каждого появления результирующего шаблона, потому что я привязываю флаг lobal к хвосту s/// ubstitution заявление.

  • [AB]sed приостанавливает сканирование, когда сталкивается с первым A или B в любой серии либо при сканировании. Он будет искать далее …
  • \([AB]\)\1\1* – по крайней мере один сразу следующий идентичный символ и любой / все продолжающиеся одинаковые символы до тех пор, пока последовательность может продолжаться. Я группирую класс символов [AB] в \( подвыражение \) и поэтому могу ссылаться на его содержимое с помощью back-reference \1 .
    • Это отличается от выполнения [AB]\{2,\} или даже \([AB]\)\{2,\} как в тех случаях sed будет рассматривать как A и B для соответствия шаблону. Скорее всего, все символы, добавленные в группу соответствия, идентичны первому совпадению на [AB] .
  • \n&\n – в правой части s/// ubstitution я ссылаюсь на всю последовательность, только что сопоставленную с & и вставляя в ее голову и хвост символ \n ewline.
    • Многие sed s не будут поддерживать \n ewline обратную косую черту в правой части подстановки. Если это так, вы можете просто использовать буквенный символ \n ewline вместо n .

Ниже приведено описание этого s/// ubstitution в строке ввода примера:

 \nAA\nHello\nBB\n Text \nAA\nByeBye\nBB\n 

Вы можете видеть, что помимо вставки лишних символов \n ewline (который в значительной степени является единственным символом, который может встречаться только в пространстве шаблонов sed в результате редактирования) sed не изменил строку вообще – ни один входной символ не был изменен ,

Вы также можете видеть, что каждая последовательность AAA* или BBB* теперь немедленно заключена в \n ewlines. Поэтому, когда я делаю следующий g lobal s/// ubstitution, я просто должен сказать sed

  • AA\n – начинайте каждый матч только в конце конца последовательности AAA* , за которым следует …
  • \([[:alnum:]]\{1,\}\) – один или несколько буквенно-цифровых символов. Это никогда не должно выстраиваться в последовательность BBB* , потому что там, где AAA* сразу предшествует BBB* между ними есть два промежуточных \n ewlines. Эта алфавитно-цифровая последовательность должна немедленно следовать за …
  • \nBB – головной конец последовательности BBB* .

И в правой части …

  • CC\1DD – заменим AA\n w / CC \1 на себя и \nBB w / DD .

В этот момент l ook показывает …

 \nCCHelloDD\n Text \nCCByeByeDD\n 

… очевидный успех! Теперь нам нужно только сделать …

 `s/\n//g` 

… и удалите все оставшиеся \n разделители ewline и работа будет выполнена.

Вот результат моего удара случайным образом на клавиатуре в течение нескольких секунд, отображаемых в качестве входных данных. Это гораздо более сложный пример ввода, поэтому я разбил его с экранированными \n ewlines в документе здесь. Оболочка удалит все новые строки, которые вы можете увидеть здесь, прежде чем передавать результат одной строки в sed :

 sed ... <<IN AA kj \ BB\ AAAAAABAkl\ AAAAasjd\ AAAAfo\ BB\ AAia\ BBsdfjomAl\ BBks\ BBmdlmdsviom\ BB\ AAiodsvgmnoi IN 

… и l ook после первой s/// ubstitution:

 \nAA\n kj \nBB\n\nAAAAAA\nBAkl\nAAAA\nasjd\nAAAA\nfo\nBB\n\nAA\nia\nBB\nsdfjomAl\nBB\nks\nBB\nmdlmdsviom\nBB\n\nAA\niodsvgmnoi 

… и после второго …

 \nAA\n kj \nBB\n\nAAAAAA\nBAkl\nAAAA\nasjd\nAACCfoDD\n\nCCiaDD\nsdfjomAl\nBB\nks\nBB\nmdlmdsviom\nBB\n\nAA\niodsvgmnoi 

… и конечный продукт …

 AA kj BBAAAAAABAklAAAAasjdAACCfoDDCCiaDDsdfjomAlBBksBBmdlmdsviomBBAAiodsvgmnoi 
  • regex заменить текст в XML-файле в узле из командной строки
  • Разнообразные форматированные разрешения
  • Как печатать IP / MASK из списка?
  • Заменить многострочную строку в файлах
  • как использовать команду Diff, игнорируя текст в строке и получать непревзойденные данные на основе условия
  • sed, чтобы заменить строку из одного файла на все содержимое другого файла
  • Параллелизация sed дает разную производительность
  • Как добавить строку в первое поле вывода с помощью awk?
  • Что значит . совпадение?
  • Прочитайте строку из файла и добавьте ее в ту же строку другого файла
  • Извлечение частей строки, разделенной пробелами
  • Linux и Unix - лучшая ОС в мире.