Take the 2-minute tour ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

I need to pull the version # out of a Vim script that might look something like:

 " some header blah blah
 " Version: 0.1
 [a bunch of code]
 " Version: fake--use only the first version

The expected output is 0.1. If a Version # doesn't exist, it should return the empty string or something like that.

I'm new to Powershell, so this is what I have so far:

Get-Content somescript.vim -ErrorAction SilentlyContinue |
    Select-String '^" Version: (.*)' | 
    select -First 1 -ExpandProperty Matches |
    select -ExpandProperty Groups |
    select -Index 1 |
    select -ExpandProperty Value

It's just that it feels... kind of verbose. For comparison, here's my *nix version:

perl -ne '/^" Version: (.*)/ && do { print "$1\n"; exit }' somescript.vim 2>/dev/null

Or you could write a similarly concise awk script

Is there any hope for my Windows version being as concise?

share|improve this question

2 Answers 2

up vote 2 down vote accepted

In PowerShell everything is an object, so you can access properties (and properties of properties) using the dot operator just like you can in most object based languages.

$matches = Get-Content somescript.vim -ErrorAction SilentlyContinue |
    Select-String '^" Version: (.*)'

if ($matches)
{
    $matches[0].Matches.Groups[1].Value
}
share|improve this answer
    
Ah, of course, just use an intermediate result. Hadn't thought of it, but totally obvious in retrospect. –  Michael Kropat May 23 at 19:40

I haven't found a terser approach using only built-ins, but having a little more confidence now in Powershell, I think I'd simply refactor out the group matching code:

filter Select-MatchingGroupValue($groupNum) {
    if (! $groupNum) {
        $groupNum = 0
    }
    select -InputObject $_ -ExpandProperty Matches |
        select -ExpandProperty Groups |
        select -Index $groupNum |
        select -ExpandProperty Value
}

Then you could use it like:

Get-Content .\somescript.vim -ErrorAction SilentlyContinue |
    Select-String '^" Version: (.*)' |
    select -First 1 |
    Select-MatchingGroupValue 1

In the end, you haven't saved that many lines, but refactoring out the tedious expansions of Matches, Groups, and Value makes the resulting code much clearer IMO.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.