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

Попытайтесь добавить эту строку в своем .bashrc:

complete -f -o default -X '!*.+(zip|udp)' unzip
2
13.01.2015, 00:33
2 ответа

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

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

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

sed 's/AA\(.*\)BB/CC\1DD/g'
2
27.01.2020, 22:00
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 следует выполнять только в том случае, если между двумя группами есть 1 или более буквенно-цифровых символов, и всегда следует сожмите возможные события как можно ближе друг к другу.

В примере печатается:

CCHelloDD Text CCByeByeDD

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

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

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

Вот l ook в результатах этого 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 прямые линии между ними. За этой буквенно-цифровой последовательностью сразу должен следовать ...
  • \ nBB - головной конец последовательности BBB * .

А в правой части ...

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

Здесь l ок показывает ...

\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
2
27.01.2020, 22:00

Теги

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