Замена определенной части
У меня есть список, как это:
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