From: "René Scharfe" <l.s.r@web.de>
To: Brandon Chinn <brandonchinn178@gmail.com>, git@vger.kernel.org
Subject: [PATCH] grep: fix --column --only-match for 2nd and later matches
Date: Fri, 24 Apr 2026 23:04:27 +0200 [thread overview]
Message-ID: <9bd69678-f04b-41d2-ad74-a386820d34c8@web.de> (raw)
In-Reply-To: <CAGANf=dkRgFp+bEkB5f8QBeiR3m+3WE8sKqT9vKstkGHqbxA3A@mail.gmail.com>
"git grep --column --only-match" shows the 1-based column number of the
first match on each line, but confusing numbers for further matches.
Example:
$ echo 123456789012345678901234567890 >file
$ for d in 1 2 3 4 5 6 7 8 9 0
do
git grep --no-index --column --only-matching $d file |
awk -v FS=: -v l=$d: '{l = l sprintf("%3s", $2)} END {print l}'
done
1: 1 2 12
2: 2 4 14
3: 3 6 16
4: 4 8 18
5: 5 10 20
6: 6 12 22
7: 7 14 24
8: 8 16 26
9: 9 18 28
0: 10 20 30
Report the column number of each match instead:
$ for d in 1 2 3 4 5 6 7 8 9 0
do
./git grep --no-index --column --only-matching $d file |
awk -v FS=: -v l=$d: '{l = l sprintf("%3s", $2)} END {print l}'
done
1: 1 11 21
2: 2 12 22
3: 3 13 23
4: 4 14 24
5: 5 15 25
6: 6 16 26
7: 7 17 27
8: 8 18 28
9: 9 19 29
0: 10 20 30
We need to adjust the test in t7810 as well. The file it uses has the
following five lines; I add a line highlighting the matches and a ruler
at the bottom here, to make it easier to see that the second "mmap"
indeed starts at column 14:
foo mmap bar
foo_mmap bar
foo_mmap bar mmap
foo mmap bar_mmap
foo_mmap bar mmap baz
==== ====
123456789 123456789 1
Reported-by: Brandon Chinn <brandonchinn178@gmail.com>
Signed-off-by: René Scharfe <l.s.r@web.de>
---
grep.c | 3 ++-
t/t7810-grep.sh | 6 +++---
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/grep.c b/grep.c
index c7e1dc1e0e..a54e5d86a9 100644
--- a/grep.c
+++ b/grep.c
@@ -1267,6 +1267,7 @@ static void show_line(struct grep_opt *opt,
regmatch_t match;
enum grep_context ctx = GREP_CONTEXT_BODY;
int eflags = 0;
+ const char *start = bol;
if (want_color(opt->color)) {
if (sign == ':')
@@ -1285,6 +1286,7 @@ static void show_line(struct grep_opt *opt,
if (match.rm_so == match.rm_eo)
break;
+ cno = bol - start + match.rm_so + 1;
if (opt->only_matching)
show_line_header(opt, name, lno, cno, sign);
else
@@ -1294,7 +1296,6 @@ static void show_line(struct grep_opt *opt,
if (opt->only_matching)
opt->output(opt, "\n", 1);
bol += match.rm_eo;
- cno += match.rm_eo;
rest -= match.rm_eo;
eflags = REG_NOTBOL;
}
diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh
index 64ac4f04ee..bd439563d6 100755
--- a/t/t7810-grep.sh
+++ b/t/t7810-grep.sh
@@ -322,11 +322,11 @@ do
${HC}file:1:5:mmap
${HC}file:2:5:mmap
${HC}file:3:5:mmap
- ${HC}file:3:13:mmap
+ ${HC}file:3:14:mmap
${HC}file:4:5:mmap
- ${HC}file:4:13:mmap
+ ${HC}file:4:14:mmap
${HC}file:5:5:mmap
- ${HC}file:5:13:mmap
+ ${HC}file:5:14:mmap
EOF
git grep --column -n -o -e mmap $H >actual &&
test_cmp expected actual
--
2.54.0
next prev parent reply other threads:[~2026-04-24 21:09 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-21 5:03 git grep bug with --column and --only-matching Brandon Chinn
2026-04-21 20:33 ` René Scharfe
2026-04-23 9:44 ` Phillip Wood
2026-04-24 21:04 ` René Scharfe [this message]
2026-05-04 13:10 ` [PATCH] grep: fix --column --only-match for 2nd and later matches Phillip Wood
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9bd69678-f04b-41d2-ad74-a386820d34c8@web.de \
--to=l.s.r@web.de \
--cc=brandonchinn178@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox