замена строк не работает в powershell - PullRequest
0 голосов
/ 24 декабря 2018

У меня проблема с powershell.Это мой код:

$content = [IO.File]::ReadAllText(".\file.js")
$vars = @()

ForEach ($line in $($content -split "`r`n")) {
    if ($line -Match "=") {
        $vars += $line.substring(0,$line.IndexOf("="))
    }
    ForEach ($e in $vars) {
        $line = $line.Replace($e, "$" + $e)
    }
    Write-Host($line)
}

И file.js:

x = 123
(x)

Вывод этого кода составляет $ x = 123 и (x).(х) должно быть ($ х).Строка $line = $line.Replace($e, "$" + $e) не работает.

РЕДАКТИРОВАТЬ: ОК.Проблема была в том, что $ e было равно "x ", а не "x".

1 Ответ

0 голосов
/ 24 декабря 2018

Вы нашли ключ к решению своей проблемы, осознав, что ваша попытка извлечь x из строки, такой как x = 123, была ошибочной, поскольку вместо нее было извлечено x (с завершающим пробелом).

Самое простое решение - просто урезать пробел из результата вашего оператора извлечения подстроки (обратите внимание на вызов .Trim()):

# Extract everything before "=", then trim whitespace.
$vars += $line.substring(0,$line.IndexOf("=")).Trim()

Однако рассмотрите возможность оптимизации кода следующим образом:

$varsRegex = $sep = ''

# Use Get-Content to read the file as an *array of lines*.
Get-Content .\file.js | ForEach-Object {

  # See if the line contains a variable assignment.
  # Construct the regex so that the variable name is captured via 
  # a capture group, (\w+), excluding the surrounding whitespace (\s).
  if ($_ -match '^\s*(\w+)\s*=') {
    # Extract the variable name from the automatic $Matches variable.
    # [1] represents the 1st (and here only) capture group.
    $varName = $Matches[1]
    # Build a list of variable names as a regex with alternation (|) and
    # enclose each name in \b...\b to minimize false positives while replacing.
    $varsRegex += $sep + '\b' + $varName + '\b'
    $sep = '|'
  }

  # Replace the variable names with themselves prefixed with '$'
  # Note how '$' must be escaped as '$$', because it has special meaning in 
  # the replacement operand; for instance, '$&' refers to what the regex
  # matched in the input string (in this case: a variable name).
  $line = $_ -replace $varsRegex, '$$$&'

  # Output the modified line.
  # Note: Use Write-Host only for printing directly to the screen.
  $line

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...