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?
2 Answers 2
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
}
-
\$\begingroup\$ Ah, of course, just use an intermediate result. Hadn't thought of it, but totally obvious in retrospect. \$\endgroup\$Michael Kropat– Michael Kropat2014年05月23日 19:40:12 +00:00Commented May 23, 2014 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.