From f134278d2f888a492124020d770219fd61cb6174 Mon Sep 17 00:00:00 2001 From: can1357 Date: Wed, 18 Mar 2026 23:57:55 +0100 Subject: [PATCH] tr: fix graph/print character class mapping --- src/uu/tr/src/operation.rs | 6 +++--- tests/by-util/test_tr.rs | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/uu/tr/src/operation.rs b/src/uu/tr/src/operation.rs index 2f45bc9b990..6d3d3984561 100644 --- a/src/uu/tr/src/operation.rs +++ b/src/uu/tr/src/operation.rs @@ -177,8 +177,7 @@ impl Sequence { .chain(33..=47) .chain(58..=64) .chain(91..=96) - .chain(123..=126) - .chain(std::iter::once(32)), // space + .chain(123..=126), ), Class::Print => Box::new( (48..=57) // digit @@ -188,7 +187,8 @@ impl Sequence { .chain(33..=47) .chain(58..=64) .chain(91..=96) - .chain(123..=126), + .chain(123..=126) + .chain(std::iter::once(32)), // space ), Class::Punct => Box::new((33..=47).chain(58..=64).chain(91..=96).chain(123..=126)), Class::Space => Box::new(unicode_table::SPACES.iter().copied()), diff --git a/tests/by-util/test_tr.rs b/tests/by-util/test_tr.rs index 4a7c266b92a..81436bd766c 100644 --- a/tests/by-util/test_tr.rs +++ b/tests/by-util/test_tr.rs @@ -65,6 +65,38 @@ fn test_delete() { .stdout_is("BD"); } +#[test] +fn test_delete_graph_and_print_match_gnu() { + let input = [b' ', b'A', b'!', b'\t', b'\n']; + new_ucmd!() + .args(&["-d", "[:graph:]"]) + .pipe_in(input) + .succeeds() + .stdout_is_bytes([b' ', b'\t', b'\n']); + + new_ucmd!() + .args(&["-d", "[:print:]"]) + .pipe_in(input) + .succeeds() + .stdout_is_bytes([b'\t', b'\n']); +} + +#[test] +fn test_delete_complement_graph_and_print_match_gnu() { + let input = [b' ', b'A', b'!', b'\t', b'\n']; + new_ucmd!() + .args(&["-d", "-c", "[:graph:]"]) + .pipe_in(input) + .succeeds() + .stdout_is_bytes([b'A', b'!']); + + new_ucmd!() + .args(&["-d", "-c", "[:print:]"]) + .pipe_in(input) + .succeeds() + .stdout_is_bytes([b' ', b'A', b'!']); +} + #[test] fn test_delete_afterwards_is_not_flag() { new_ucmd!()