6
\$\begingroup\$

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?

\$\endgroup\$
3
\$\begingroup\$

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
}
\$\endgroup\$
  • \$\begingroup\$ Ah, of course, just use an intermediate result. Hadn't thought of it, but totally obvious in retrospect. \$\endgroup\$ – Michael Kropat May 23 '14 at 19:40
3
\$\begingroup\$

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.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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