#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
путем или нет если вы хотите узнать больше об этом методе, пожалуйста, прочтите это — я отредактировал приведенный выше скрипт для получения данных и сохранения в другом файле