Я не совсем уверен, что ваши переменные всегда содержат. Поэтому я приведу несколько примеров.
Предполагается, что $level3
содержит имя сервера, а не .mig
$level3 = '\\na0maa-euc01\data1\Nissan Production Engineering\TC Facility\X11M'
$level3old = $level3 -replace '^\\\\.*?\\(.*?\\[^\\]+)','$1.mig'
# Output
$level3old
data1\Nissan Production Engineering.mig\TC Facility\X11M
Предполагается, что $level3
начинается с Общая папка не содержит .mig
$level3 = 'data1\Nissan Production Engineering\TC Facility\X11M'
$level3old = $level3 -replace '^.*?\\[^\\]+','$&.mig'
# Output
$level3old
data1\Nissan Production Engineering.mig\TC Facility\X11M
Объяснение:
-replace
использует сопоставление с регулярным выражением, за которым следует замена строки (с некоторым совпадением Ссылки). Поскольку \
является специальным символом регулярного выражения, его необходимо экранировать sh для буквального совпадения. Таким образом, чтобы соответствовать \
, вам нужно \\
. Чтобы соответствовать \\
, вам нужно \\\\
, то есть один \
escape для каждого литерала \
.
Инициал ^
соответствует началу строки. Это первое возможное место для начала сопоставления строки.
.*?
лениво сопоставляет любые символы. Это обычно продолжает сопоставление, пока не достигнет другого условия сопоставления. Таким образом, .*?\\
будет соответствовать любому символу вплоть до следующего включительно \
.
[^]
- класс символов отрицания. Все, что следует за ^
в пределах []
, означает что-либо, кроме этих символов. [^\\]
соответствует всему, кроме \
.
+
соответствует одному или нескольким предыдущим матчам. [^\\]+
соответствует всему, кроме \
один или несколько раз.
В строке замены $1
относится к сопоставленным символам в группе захвата 1. В части регулярного выражения ()
обозначает группу захвата , При первом открытии (
начинается группа захвата, которой присваивается имя 1. Если вы не указали ее явно.
В строке замены $&
относится к каждому сопоставленному символу. $0
также может быть использовано, потому что по умолчанию все совпадение захватывает группу 0.