2013-10-09 6 views
0

Я работаю над скриптом powershell, чтобы проанализировать файл в другом формате с разделителями, который можно легко загрузить в Excel или DB.Escape Tilde in Powershell Replace

Я получил это в основном за исключением поиска и замены строки "~ S ~ |" где все символы должны быть взяты буквально.

Я пробовал следующее безрезультатно: "\ ~ S \ ~ \ |" "~ S ~ \ |" "~ S ~ |" < - этот белок, так как | является или находится на территории RegEx

Любые предложения были бы полезными.

+1

Единственный мета характер этого выбора будет '|'. Следующее регулярное выражение будет соответствовать этой точной последовательности: '~ S ~ \ |' –

+0

Это прекрасно работает на консоли, но через скрипт с очень длинной строкой с несколькими экземплярами она пропускает некоторые. – chonerman

ответ

5

Метод regex.escape предназначен для такого рода ситуаций, в которых вы не знаете, какие символы считаются специальные (мета-символы).

PS> [regex]::escape("~S~|") 
~S~\| 

Вы можете видеть, что только мета символ является знаком трубы (например «|») и что метод побега избежали этого для вас (добавлен обратный слэш перед ним).

PS> "this~S~|is~S~|a~S~|dog" -replace [regex]::escape('~S~|') 
thisisadog 
1

вы можете попробовать это:

$string = "this~S~|is~S~|a~S~|dog" 
$string -replace '~S~\|',' ' 
1

Мне удалось обойти это с помощью работы. Спасибо за все ваши данные, все ответы работают так, как вы описали.

Для того, чтобы это работало в очень длинной строке с несколькими экземплярами значения «Найти», мне пришлось строить строку по мере ее роста.

Например:

$tString = $_ 
$tString = $tString -replace 'Name:', '' 
$tString = $tString -replace 'Id:', '' 
$tString = $tString -replace 'Administrative group:', '' 
$tString = $tString -replace 'Administrative class\(es\):', '' 
$tString = $tString -replace 'Primary group:', '' 
$tString = $tString -replace 'Session group:', '' 
$tString = $tString -replace '~S~([^-]+)\|', '$1|' 
$tString = $tString -replace ';\|', ';' 
return $tString