Замена определенных символов в текстовом файле в сценарии Powershell

#powershell

#powershell

Вопрос:

У меня есть текстовый файл с образцом текста:

   Starting at line 0 $/A/B/C/DemoDemo.sln
  class string foo{ 
       return "ab"; 
  }
  

Я хочу заменить косую черту в строке на путь к / . Но это должно изменить в других частях кода. Для этого я должен использовать Powershell. Ожидаемый код:

   Starting at line 0 $/A/B/C/Demo/Demo.sln
  class string foo{ 
       return "ab"; 
  }
  

Комментарии:

1. Всегда ли это будет один и тот же путь? Что в нем постоянно? C:?

2. да, C:/Demo будет постоянным

Ответ №1:

Этот подход использует построчное совпадение для спецификации пути и при обнаружении заменяет все обратные косые черты в этой части косыми чертами.

 $file   = 'D:Testblah.txt'
$result = switch -Regex -File $file {
    '^(.*)s([a-z]:[\/](?:[^:*?"<>|rn])*)' { 
        '{0} {1}' -f  $matches[1], ($matches[2]-replace '\', '/')
    }
    default { $_ }
}

# output on screen
$result

# overwrite file
$result | Set-Content -Path $file -Force
  

Результат будет выглядеть примерно так

   Starting at line 0 C:/Demo/Demo.sln
  class string foo{ 
       return "ab"; 
  }

  Starting at line 0 C:/Demo/AnotherDemo.sln
  class string bar{ 
       return "ba"; 
  }
  

Подробности регулярных выражений:

 ^                          Assert position at the beginning of the string
(                          Match the regular expression below and capture its match into backreference number 1
   .                       Match any single character that is not a line break character
      *                    Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
)                         
s                         Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.)
(                          Match the regular expression below and capture its match into backreference number 2
   [a-z]                   Match a single character in the range between “a” and “z”
   :                       Match the character “:” literally
   [\/]                   Match a single character present in the list below
                           A  character
                           The character/”
   (?:                     Match the regular expression below
      [^:*?"<>|rn]       Match a single character NOT present in the list below
                           One of the characters “:*?"<>|”
                           A carriage return character
                           A line feed character
   )*                      Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
)
  

Комментарии:

1. путь не будет таким же. Там будет строка, начинающаяся со строки, но номер и путь могут измениться. так можно ли использовать, например, «начиная со строки d of», что-то вроде регулярного выражения?

2. @PrakashKumar Ты пробовал? Регулярное выражение ищет спецификацию пути, не имеет значения, какой это путь. Единственный путь, который вам нужно изменить, это для $file

3. да, это не сработало. в файле будет несколько путей

4. путь не будет same……it было бы что-то вроде $/A / B / C / D / …. потом что-то еще…. A B C D будет исправлено и подписано

5. @PrakashKumar для меня это не имеет смысла .. регулярное выражение выбирает любой локальный путь в файле, так о каком пути вы говорите? Вот почему я включил один дополнительный в ваш пример.

Ответ №2:

Решением может быть использование Test-Path $string -IsValid функции (документация здесь ) для каждой строки в вашем файле, содержащей хотя бы один символ », для этого вы можете разделить текст в вашем файле на пробелы и проверить, какая из результирующих строк соответствует регулярному '.*\.*' выражению.

Результат может быть примерно таким:

 $text = Get-Content -Path 'C:...data.txt'
$text -split 's' | ForEach-Object {
    #find strings with  only
    if($_ -match '.*\.*') {
        #if the string is like a path
        if(Test-Path $_ -IsValid) {
            #replace  with /
            $replace = $_ -replace '\','/'
            #replace path string with fixed path (note: [regex]::escape(...) is necessary to avoid using regex in this replace, because $_ contains some characters like  end similar)
            $text = $text -replace [regex]::escape($_), $replace
        }
    }
}

$text > 'C:...result.txt'
  

Комментарии:

1. У меня может быть несколько строк в файле с , которые я не хочу заменять, я хочу заменить только те строки, которые являются путями. У меня нет текста, у меня есть файл с именем data.text

2. $text — это переменная, в которой вы можете сохранять данные в свой файл (например, используя $text = Get-Content $filePath ). С помощью приведенного выше сценария вы можете заменить все символы на / во всех и только в строках, представляющих путь. Используя метод Test-Path $sometext -IsValid , вы можете проверить, является ли строка внутри $sometext путем или нет если вы хотите узнать больше об этом методе, пожалуйста, прочтите это — я отредактировал приведенный выше скрипт для получения данных и сохранения в другом файле