diff --git a/src/printer.rs b/src/printer.rs index 48492fe8..5aaf1475 100644 --- a/src/printer.rs +++ b/src/printer.rs @@ -242,23 +242,13 @@ impl Printer { line_number: Option, ) { if !self.line_per_match && !self.only_matching { - let column = - if self.column { - Some(re.find(&buf[start..end]) - .map(|m| m.start()).unwrap_or(0) as u64) - } else { - None - }; + let column = re.find(&buf[start..end]) + .map(|m| m.start()).unwrap_or(0); return self.write_match( re, path, buf, start, end, line_number, column); } for m in re.find_iter(&buf[start..end]) { - let column = - if self.column { - Some(m.start() as u64) - } else { - None - }; + let column = m.start(); self.write_match( re, path.as_ref(), buf, start, end, line_number, column); } @@ -272,7 +262,7 @@ impl Printer { start: usize, end: usize, line_number: Option, - column: Option, + column: usize, ) { if self.heading && self.with_filename && !self.has_printed { self.write_file_sep(); @@ -285,8 +275,8 @@ impl Printer { if let Some(line_number) = line_number { self.line_number(line_number, b':'); } - if let Some(c) = column { - self.column_number(c + 1, b':'); + if self.column { + self.column_number(column as u64 + 1, b':'); } if self.replace.is_some() { let mut count = 0; @@ -308,8 +298,9 @@ impl Printer { } } else { let line_buf = if self.only_matching { - let m = re.find(&buf[start..end]).unwrap(); - &buf[start + m.start()..start + m.end()] + let start_offset = start + column; + let m = re.find(&buf[start_offset..end]).unwrap(); + &buf[start_offset + m.start()..start_offset + m.end()] } else { &buf[start..end] }; diff --git a/tests/tests.rs b/tests/tests.rs index 38812c4e..95c6e6a5 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -1607,6 +1607,51 @@ fn regression_391() { assert_eq!(lines, "bar.py\n"); } +// See: https://github.com/BurntSushi/ripgrep/issues/451 +#[test] +fn regression_451_only_matching_as_in_issue() { + let wd = WorkDir::new("regression_451_only_matching"); + let path = "digits.txt"; + wd.create(path, "1 2 3\n"); + + let mut cmd = wd.command(); + cmd.arg("[0-9]+").arg(path).arg("--only-matching"); + let lines: String = wd.stdout(&mut cmd); + + let expected = "\ +1 +2 +3 +"; + + assert_eq!(lines, expected); +} + +// See: https://github.com/BurntSushi/ripgrep/issues/451 +#[test] +fn regression_451_only_matching() { + let wd = WorkDir::new("regression_451_only_matching"); + let path = "digits.txt"; + wd.create(path, "1 2 3\n123\n"); + + let mut cmd = wd.command(); + cmd.arg("[0-9]").arg(path) + .arg("--only-matching") + .arg("--column"); + let lines: String = wd.stdout(&mut cmd); + + let expected = "\ +1:1:1 +1:3:2 +1:5:3 +2:1:1 +2:2:2 +2:3:3 +"; + + assert_eq!(lines, expected); +} + #[test] fn type_list() { let wd = WorkDir::new("type_list");