From: Beat Bolli Date: Sat, 16 Mar 2024 10:09:47 GMT Subject: Re: [PATCH v2 16/22] t/t3*: merge a "grep | awk" pipeline Message-ID: <5aacb015-c01a-4c6f-8e37-931581aa71b6@drbeat.li> In-Reply-To: On 16.03.24 02:49, Taylor Blau wrote: > On Fri, Mar 15, 2024 at 08:46:13PM +0100, Beat Bolli wrote: >> Signed-off-by: Beat Bolli >> --- >> t/t3920-crlf-messages.sh | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/t/t3920-crlf-messages.sh b/t/t3920-crlf-messages.sh >> index 5eed640a6825..50ae222f0842 100755 >> --- a/t/t3920-crlf-messages.sh >> +++ b/t/t3920-crlf-messages.sh >> @@ -97,7 +97,7 @@ test_expect_success 'branch: --verbose works with messages using CRLF' ' >> git branch -v >tmp && >> # Remove first two columns, and the line for the currently checked out branch >> current=$(git branch --show-current) && >> - grep -v $current actual && >> + awk "/$current/ { next } { \$1 = \$2 = \"\" } 1" actual && > > I think that using `next` here is fine to ignore lines that match > `$current`, but the canonical approach would probably be using the > `!` operator instead to negate the match, like so: > > awk "!/$current/ { \$1 = \$2 = \"\" } 1" actual && > > Not worth a reroll, of course, just something that I noticed while > reading. Except it's not the same :-) This was actually my first try, but then I realized that awk continues to evaluate patterns and actions until the end of the script. The "1" at the end is the "always true" pattern that causes the default action "print $0" to run. So the "next" is needed to discard the current line. Having said this, awk "!/$current/ { \$1 = \$2 = \"\"; print \$0 }" actual && would work, and it would also remove the obscure flow detailed above. Regards, Beat