Заменить несколько строк в файле с помощью Powershell - PullRequest
0 голосов
/ 10 января 2019

Мы хотим заменить несколько экземпляров переменной id=* определенным шаблоном, например id=1234. Я уже сделал этот скрипт Powershell (и предпочитаю использовать Powershell в качестве решения):

$line = Get-Content C:\test.txt | Select-String "id=" | Select-Object -ExpandProperty Line
$content = Get-Content C:\test.txt
$content | ForEach {$_ -replace $line,"id=1234"} | Set-Content C:\test.txt
Get-Content C:\test.txt

Это работает, если существует только 1 экземпляр id=..., когда файл содержит несколько экземпляров id=..., тогда этап замены вообще не выполняется.

Входной файл похож на:

text over here
id=1
text over here: id={123456}
text
id=number1
id=#3 text 
id=3+3 text 

, что должно привести к:

text over here
id=1234
text over here: id=1234
text
id=1234
id=1234 text 
id=1234 text 

Ответы [ 2 ]

0 голосов
/ 10 января 2019

То, что вы хотите, это захватить все символы после id=, пока вы не столкнетесь с пробелом.

Следующее будет работать нормально

$content = Get-Content "C:test.txt" -raw
$content = $content -replace 'id=[^\s]*','id=1234'
Set-Content C:\test.txt
Get-Content C:\test.txt

Использование параметра -Raw быстро загрузит файл в строку, а не в массив. Оттуда, используя замену выше, вы получите желаемый результат.

[^\s]* соответствует одному символу, НЕ включая символ пробела (пробел, табуляция, возврат каретки, перевод строки)

Вы можете использовать RegexStorm при создании операторов регулярных выражений.

См. Проверенное здесь регулярное выражение.

0 голосов
/ 10 января 2019

Я думаю, что это будет делать:

Прочитать текст как строковый массив и заменить построчно:

(Get-Content 'C:\test.txt') | 
    ForEach-Object { $_ -replace '(id\s*=\s*[^\s]+)', 'id=1234' } | 
    Add-Content -Path 'C:\test_updated.txt'

или прочитайте текст как одну строку и выполните многострочную замену ((?m))

(Get-Content C:\test.txt -Raw) -replace '(?m)(id\s*=\s*[^\s]+)', 'id=1234' | 
    Set-Content -Path 'C:\test_updated.txt'

Я настоятельно рекомендую использовать новое имя файла для выходного файла, чтобы не перезаписывать оригинал.

В обоих случаях код возвращает:

text over here
id=1234
text over here: id=1234
text
id=1234
id=1234 text 
id=1234 text

Сведения о регулярном выражении

(            Match the regular expression below and capture its match into backreference number 1
   id        Match the characters “id” literally
   \s        Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.)
      *      Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
   =         Match the character “=” literally
   \s        Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.)
      *      Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
   [^\s]     Match any character that is NOT a “A whitespace character (spaces, tabs, line breaks, etc.)”
      +      Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
...