On Wed, Mar 26, 2025 at 02:07:10PM -0400, Eric Sunshine wrote: > On Wed, Mar 26, 2025 at 1:44 PM Jeff King <peff@xxxxxxxx> wrote: > > On Tue, Mar 25, 2025 at 11:32:14PM +0000, Johannes Schindelin via GitGitGadget wrote: > > > Let's unconfuse the script by letting it parse the first matching line > > > and ignore the rest. > > > > Makes sense. I wondered if this: > > > > > get_version_line() { > > > - LANG=C LC_ALL=C $CC -v 2>&1 | grep ' version ' > > > + LANG=C LC_ALL=C $CC -v 2>&1 | sed -n '/ version /{p;q}' > > > > might be more readable with "grep -m1", but it looks like "-m" is not in > > POSIX. So what you wrote is probably safer. > > It's probably an indication that I've done too much `sed` programming, > but I find Dscho's version more obvious. That aside, your response > made me take a closer look at what Dscho wrote and I noticed that it > is syntactically flawed, at least for BSD-lineage `sed`. Testing on > macOS reveals that this is indeed so: > > % LANG=C LC_ALL=C cc -v 2>&1 | sed -n '/ version /{p;q}' > sed: 1: "/ version /{p;q}": extra characters at the end of q command > > The problem is that the `q` function takes no arguments, but > BSD-lineage `sed` thinks that the closing `}` is an argument rather > than a terminator. Fixing this requires inserting a terminator after > `q`, which will be either a newline character or a semicolon. So, the > correct form is: > > sed -n '/ version /{p;q;} Heh, I think it was the braces and semicolons that made my spider-sense tingle, probably because I've been bitten by those subtleties in the past. I think just "/foo/p;q" works on GNU sed, but no idea if it does elsewhere. What you wrote seems the safest. -Peff