mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-28 11:37:44 +00:00
Merge pull request #7006 from cakebaker/csplit_fix_invalid_pattern
csplit: allow offset without sign in pattern
This commit is contained in:
commit
6f678269ab
2 changed files with 51 additions and 28 deletions
|
@ -106,7 +106,7 @@ pub fn get_patterns(args: &[String]) -> Result<Vec<Pattern>, CsplitError> {
|
|||
fn extract_patterns(args: &[String]) -> Result<Vec<Pattern>, CsplitError> {
|
||||
let mut patterns = Vec::with_capacity(args.len());
|
||||
let to_match_reg =
|
||||
Regex::new(r"^(/(?P<UPTO>.+)/|%(?P<SKIPTO>.+)%)(?P<OFFSET>[\+-]\d+)?$").unwrap();
|
||||
Regex::new(r"^(/(?P<UPTO>.+)/|%(?P<SKIPTO>.+)%)(?P<OFFSET>[\+-]?\d+)?$").unwrap();
|
||||
let execute_ntimes_reg = Regex::new(r"^\{(?P<TIMES>\d+)|\*\}$").unwrap();
|
||||
let mut iter = args.iter().peekable();
|
||||
|
||||
|
@ -219,14 +219,15 @@ mod tests {
|
|||
"{*}",
|
||||
"/test3.*end$/",
|
||||
"{4}",
|
||||
"/test4.*end$/+3",
|
||||
"/test5.*end$/-3",
|
||||
"/test4.*end$/3",
|
||||
"/test5.*end$/+3",
|
||||
"/test6.*end$/-3",
|
||||
]
|
||||
.into_iter()
|
||||
.map(|v| v.to_string())
|
||||
.collect();
|
||||
let patterns = get_patterns(input.as_slice()).unwrap();
|
||||
assert_eq!(patterns.len(), 5);
|
||||
assert_eq!(patterns.len(), 6);
|
||||
match patterns.first() {
|
||||
Some(Pattern::UpToMatch(reg, 0, ExecutePattern::Times(1))) => {
|
||||
let parsed_reg = format!("{reg}");
|
||||
|
@ -256,12 +257,19 @@ mod tests {
|
|||
_ => panic!("expected UpToMatch pattern"),
|
||||
};
|
||||
match patterns.get(4) {
|
||||
Some(Pattern::UpToMatch(reg, -3, ExecutePattern::Times(1))) => {
|
||||
Some(Pattern::UpToMatch(reg, 3, ExecutePattern::Times(1))) => {
|
||||
let parsed_reg = format!("{reg}");
|
||||
assert_eq!(parsed_reg, "test5.*end$");
|
||||
}
|
||||
_ => panic!("expected UpToMatch pattern"),
|
||||
};
|
||||
match patterns.get(5) {
|
||||
Some(Pattern::UpToMatch(reg, -3, ExecutePattern::Times(1))) => {
|
||||
let parsed_reg = format!("{reg}");
|
||||
assert_eq!(parsed_reg, "test6.*end$");
|
||||
}
|
||||
_ => panic!("expected UpToMatch pattern"),
|
||||
};
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -273,14 +281,15 @@ mod tests {
|
|||
"{*}",
|
||||
"%test3.*end$%",
|
||||
"{4}",
|
||||
"%test4.*end$%+3",
|
||||
"%test5.*end$%-3",
|
||||
"%test4.*end$%3",
|
||||
"%test5.*end$%+3",
|
||||
"%test6.*end$%-3",
|
||||
]
|
||||
.into_iter()
|
||||
.map(|v| v.to_string())
|
||||
.collect();
|
||||
let patterns = get_patterns(input.as_slice()).unwrap();
|
||||
assert_eq!(patterns.len(), 5);
|
||||
assert_eq!(patterns.len(), 6);
|
||||
match patterns.first() {
|
||||
Some(Pattern::SkipToMatch(reg, 0, ExecutePattern::Times(1))) => {
|
||||
let parsed_reg = format!("{reg}");
|
||||
|
@ -310,12 +319,19 @@ mod tests {
|
|||
_ => panic!("expected SkipToMatch pattern"),
|
||||
};
|
||||
match patterns.get(4) {
|
||||
Some(Pattern::SkipToMatch(reg, -3, ExecutePattern::Times(1))) => {
|
||||
Some(Pattern::SkipToMatch(reg, 3, ExecutePattern::Times(1))) => {
|
||||
let parsed_reg = format!("{reg}");
|
||||
assert_eq!(parsed_reg, "test5.*end$");
|
||||
}
|
||||
_ => panic!("expected SkipToMatch pattern"),
|
||||
};
|
||||
match patterns.get(5) {
|
||||
Some(Pattern::SkipToMatch(reg, -3, ExecutePattern::Times(1))) => {
|
||||
let parsed_reg = format!("{reg}");
|
||||
assert_eq!(parsed_reg, "test6.*end$");
|
||||
}
|
||||
_ => panic!("expected SkipToMatch pattern"),
|
||||
};
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
@ -130,8 +130,9 @@ fn test_up_to_match_sequence() {
|
|||
|
||||
#[test]
|
||||
fn test_up_to_match_offset() {
|
||||
for offset in ["3", "+3"] {
|
||||
let (at, mut ucmd) = at_and_ucmd!();
|
||||
ucmd.args(&["numbers50.txt", "/9$/+3"])
|
||||
ucmd.args(&["numbers50.txt", &format!("/9$/{offset}")])
|
||||
.succeeds()
|
||||
.stdout_only("24\n117\n");
|
||||
|
||||
|
@ -141,6 +142,9 @@ fn test_up_to_match_offset() {
|
|||
assert_eq!(count, 2);
|
||||
assert_eq!(at.read("xx00"), generate(1, 12));
|
||||
assert_eq!(at.read("xx01"), generate(12, 51));
|
||||
at.remove("xx00");
|
||||
at.remove("xx01");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -316,8 +320,9 @@ fn test_skip_to_match_sequence4() {
|
|||
|
||||
#[test]
|
||||
fn test_skip_to_match_offset() {
|
||||
for offset in ["3", "+3"] {
|
||||
let (at, mut ucmd) = at_and_ucmd!();
|
||||
ucmd.args(&["numbers50.txt", "%23%+3"])
|
||||
ucmd.args(&["numbers50.txt", &format!("%23%{offset}")])
|
||||
.succeeds()
|
||||
.stdout_only("75\n");
|
||||
|
||||
|
@ -326,6 +331,8 @@ fn test_skip_to_match_offset() {
|
|||
.count();
|
||||
assert_eq!(count, 1);
|
||||
assert_eq!(at.read("xx00"), generate(26, 51));
|
||||
at.remove("xx00");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue