user2883071
user2883071

Reputation: 980

Replace all but last instance of a character

I am writing a quick PowerShell script to replace all periods except the last instance. EG:

hello. this. is a file.name.dochello this is a filename.doc

So far from another post I was able to get this regexp, but it does not work with PowerShell:

\.(?=[^.]*\.)

As per https://www.regex101.com/, it only matches the first occurrence of a period.

EDIT: Basically I need to apply this match and replace to a directory with sub directories. So far I have this:

Get-ChildItem -Filter "*.*" | ForEach {
    $_.BaseName.Replace('.','') + $_.Extension
}

But it does not actually replace the items, and I do not think it is recursive.

I tried a few variations:

Get-Item -Filter "*.*" -Recurse |
    Rename-Item -NewName {$_.BaseName.Replace(".","")}

but I get the error message

source and destination path must be different

Upvotes: 1

Views: 838

Answers (2)

AlexMTech
AlexMTech

Reputation: 11

I had the PowerShell side of things working but was stuck on the RegEx part. I was able to match either all the "." or only the last "." which was part of the file extension. Then I found this post with the missing link: \.(?=[^.]*\.)

I added that to the rest of the PowerShell command and it worked perfectly.

Get-ChildItem -Recurse | Rename-Item -NewName {$_.Name -replace '\.(?=[^.]*\.)',' ' }

Upvotes: 1

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200293

Exclude files that don't have a period in their basename from being renamed:

Get-ChildItem -File -Recurse | Where-Object { $_.BaseName -like '*.*' } |
    Rename-Item -NewName {$_.BaseName.Replace('.', '') + $_.Extension}

Upvotes: 0

Related Questions