Замена определенной части

У меня есть список, как это:

DEL075MD1 BWP30P140LVT
AN2D4 BWP30P140LVT
INVD0P7 BWP40P140
IND2D6 BWP30P140LVT

Я хочу заменить все между D а также BWP с *

Как я могу сделать это в unix а также tcl

1 ответ

Решение
  • У вас есть весь список одновременно или вы получаете по одному предмету за раз?
  • Должны ли обрабатываться все группы D-BWP или только одна на элемент?
  • Если только один на предмет, должен ли он быть первым или последним (это самые простые альтернативы)?

У Tcl RE нет никакого вида сзади, что было бы неплохо здесь. Но вы можете обойтись без lookbehinds и lookaheads, если вы захватите стойку ворот и вставите их в замену в качестве обратных ссылок. Регулярное выражение для текста между стойками ворот должно быть [^DB]+т.е. один или несколько текстов, которые не содержат D или же B (чтобы убедиться, что матч не ускользает от ворот и придерживается других D или B в тексте). Так: {(D)[^DB]+(BWP)} (Брекеты вокруг RE обычно хорошая идея).

Если у вас есть весь список и вы хотите обработать все группы, попробуйте это:

set result [regsub -all {(D)[^DB]+(BWP)} $lines {\1*\2}]

(Если вы можете работать только с одной строкой за раз, это в основном одно и то же, вы просто используете переменную для одной строки вместо переменной для всего списка. В следующих примерах я использую lmap генерировать отдельные строки, что означает, что мне все равно нужен полный список; это всего лишь пример.)

Обработайте только первую группу в каждой строке:

set result [lmap line $lines {
    regsub {(D)[^DB]+(BWP)} $line {\1*\2}
}]

Обработать только последнюю группу в каждой строке:

set result [lmap line $lines {
    regsub {(D)[^DB]+(BWP[^D]*)$} $line {\1*\2}
}]

{(D)[^DB]+(BWP[^D]*)$} RE расширяет правильную стойку ворот, чтобы гарантировать, что нет D (и, следовательно, возможно, новая группа) где-нибудь между стойкой ворот и концом строки.

Документация: lmap (для Tcl 8.5), lmap, regsub, set, синтаксис регулярных выражений Tcl

Другие вопросы по тегам