Dnns
Dnns

Reputation: 31

Edit text between two lines using powershell

I want to change this text

PortNumber=10001
;UserName=xxxxxxxxx
;Password=xxxxxxxxx
CiPdfPath=xxxxx

into this

PortNumber=10001
UserName=xxxxxxxxx
Password=xxxxxxxxx
CiPdfPath=xxxxx

I cannot simply search for ;Username=xxxx and ;Password=xxxx because they exist multiple times in the file and need to be commented on some places.

I found the next command

$file = Get-Content "Test.ini" -raw
$file -replace "(?m)^PortNumber=10001[\n\r]+;UserName=xxxx[\r\n]+;Password=xxxx","PortNumber=10001 `r`nUserName=xxxxx`r`nPassword=xxxxx"

And it worked! But maybe it can be simplyfied

Upvotes: 0

Views: 929

Answers (4)

Matt
Matt

Reputation: 46730

I might be misunderstading the nature of the question but are you not simply trying to remove the leading semicolons? Is it important to seach for those strings exclusivley?

$file = Get-Content "Test.ini" -raw
$file -replace "(?sm)^;"
$file -replace "(?smi)^;(?=(username|password))"

Both examples should produce the same output. The first will match all leading semicolons. The second will match leading semicolons if the are followed, using a lookahead, by either username or password.

Upvotes: 0

mjolinor
mjolinor

Reputation: 68341

If you use the (?ms) (multiline-singleline) option and here-strings, you can do most of the work with copy/paste:

$string = 
@'
PortNumber=10001
;UserName=xxxxxxxxx
;Password=xxxxxxxxx
CiPdfPath=xxxxx
'@


$regex = 
@'
(?ms)PortNumber=10001
;UserName=xxxxxxxxx
;Password=xxxxxxxxx
CiPdfPath=xxxxx
'@

$replace = 
@'
PortNumber=10001
UserName=xxxxxxxxx
Password=xxxxxxxxx
CiPdfPath=xxxxx
'@

$string -replace $regex,$replace
PortNumber=10001
UserName=xxxxxxxxx
Password=xxxxxxxxx
CiPdfPath=xxxxx

Upvotes: 1

Harald F.
Harald F.

Reputation: 4793

You could use Regex.

Or even simpler, depending on your requirement;

If you know the linenumber of the lines you want to replace, you could easily do this do replace the certain lines:

Given that the file format is the text you've pasted (e.g. username on line 2 and password on line 3), read the file into a line buffer. Replace line 2 and 3 and set the content back to the file.

$lines=(Get-Content .\Test.txt)
$lines[1]= $lines[1].Replace(";","")
$lines[2]= $lines[2].Replace(";","")
$lines|Set-Content .\Test.txt

Upvotes: 0

lukiant-dev
lukiant-dev

Reputation: 51

Why don't you search full text which you'd like to replace? So find:

PortNumber=10001
;UserName=xxxxxxxxx
;Password=xxxxxxxxx
CiPdfPath=xxxxx

and replace with:

PortNumber=10001
UserName=xxxxxxxxx
Password=xxxxxxxxx
CiPdfPath=xxxxx

You can use regular expression to express irrelevant characters
http://www.regular-expressions.info/powershell.html http://www.powershelladmin.com/wiki/Powershell_regular_expressions

Upvotes: 0

Related Questions