mirror of
https://github.com/nushell/nushell.git
synced 2025-02-16 18:41:44 +01:00
flags for find (#4663)
This commit is contained in:
parent
799fa98411
commit
995757c055
@ -29,6 +29,22 @@ impl Command for Find {
|
|||||||
"regex to match with",
|
"regex to match with",
|
||||||
Some('r'),
|
Some('r'),
|
||||||
)
|
)
|
||||||
|
.switch(
|
||||||
|
"insensitive",
|
||||||
|
"case-insensitive search for regex (?i)",
|
||||||
|
Some('i'),
|
||||||
|
)
|
||||||
|
.switch(
|
||||||
|
"multiline",
|
||||||
|
"multi-line mode: ^ and $ match begin/end of line for regex (?m)",
|
||||||
|
Some('m'),
|
||||||
|
)
|
||||||
|
.switch(
|
||||||
|
"dotall",
|
||||||
|
"dotall mode: allow a dot . to match newline character \\n for regex (?s)",
|
||||||
|
Some('s'),
|
||||||
|
)
|
||||||
|
.switch("invert", "invert the match", Some('v'))
|
||||||
.rest("rest", SyntaxShape::Any, "terms to search")
|
.rest("rest", SyntaxShape::Any, "terms to search")
|
||||||
.category(Category::Filters)
|
.category(Category::Filters)
|
||||||
}
|
}
|
||||||
@ -94,7 +110,7 @@ impl Command for Find {
|
|||||||
},
|
},
|
||||||
Example {
|
Example {
|
||||||
description: "Find using regex case insensitive",
|
description: "Find using regex case insensitive",
|
||||||
example: r#"[aBc bde Arc abf] | find --regex "(?i)ab""#,
|
example: r#"[aBc bde Arc abf] | find --regex "ab" -i"#,
|
||||||
result: Some(Value::List {
|
result: Some(Value::List {
|
||||||
vals: vec![Value::test_string("aBc".to_string()), Value::test_string("abf".to_string())],
|
vals: vec![Value::test_string("aBc".to_string()), Value::test_string("abf".to_string())],
|
||||||
span: Span::test_data()
|
span: Span::test_data()
|
||||||
@ -149,13 +165,31 @@ fn find_with_regex(
|
|||||||
let ctrlc = engine_state.ctrlc.clone();
|
let ctrlc = engine_state.ctrlc.clone();
|
||||||
let config = stack.get_config()?;
|
let config = stack.get_config()?;
|
||||||
|
|
||||||
|
let insensitive = call.has_flag("insensitive");
|
||||||
|
let multiline = call.has_flag("multiline");
|
||||||
|
let dotall = call.has_flag("dotall");
|
||||||
|
let invert = call.has_flag("invert");
|
||||||
|
|
||||||
|
let flags = match (insensitive, multiline, dotall) {
|
||||||
|
(false, false, false) => "",
|
||||||
|
(true, false, false) => "(?i)",
|
||||||
|
(false, true, false) => "(?m)",
|
||||||
|
(false, false, true) => "(?s)",
|
||||||
|
(true, true, false) => "(?im)",
|
||||||
|
(true, false, true) => "(?is)",
|
||||||
|
(false, true, true) => "(?ms)",
|
||||||
|
(true, true, true) => "(?ims)",
|
||||||
|
};
|
||||||
|
|
||||||
|
let regex = flags.to_string() + ®ex;
|
||||||
|
|
||||||
let re = Regex::new(regex.as_str())
|
let re = Regex::new(regex.as_str())
|
||||||
.map_err(|e| ShellError::UnsupportedInput(format!("incorrect regex: {}", e), span))?;
|
.map_err(|e| ShellError::UnsupportedInput(format!("incorrect regex: {}", e), span))?;
|
||||||
|
|
||||||
input.filter(
|
input.filter(
|
||||||
move |value| {
|
move |value| {
|
||||||
let string = value.into_string(" ", &config);
|
let string = value.into_string(" ", &config);
|
||||||
re.is_match(string.as_str())
|
re.is_match(string.as_str()) != invert
|
||||||
},
|
},
|
||||||
ctrlc,
|
ctrlc,
|
||||||
)
|
)
|
||||||
@ -174,6 +208,7 @@ fn find_with_predicate(
|
|||||||
let redirect_stdout = call.redirect_stdout;
|
let redirect_stdout = call.redirect_stdout;
|
||||||
let redirect_stderr = call.redirect_stderr;
|
let redirect_stderr = call.redirect_stderr;
|
||||||
let engine_state = engine_state.clone();
|
let engine_state = engine_state.clone();
|
||||||
|
let invert = call.has_flag("invert");
|
||||||
|
|
||||||
let capture_block = predicate;
|
let capture_block = predicate;
|
||||||
let block_id = capture_block.block_id;
|
let block_id = capture_block.block_id;
|
||||||
@ -205,7 +240,7 @@ fn find_with_predicate(
|
|||||||
redirect_stderr,
|
redirect_stderr,
|
||||||
)
|
)
|
||||||
.map_or(false, |pipeline_data| {
|
.map_or(false, |pipeline_data| {
|
||||||
pipeline_data.into_value(span).is_true()
|
pipeline_data.into_value(span).is_true() != invert
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
ctrlc,
|
ctrlc,
|
||||||
@ -223,6 +258,7 @@ fn find_with_rest(
|
|||||||
let metadata = input.metadata();
|
let metadata = input.metadata();
|
||||||
let engine_state = engine_state.clone();
|
let engine_state = engine_state.clone();
|
||||||
let config = stack.get_config()?;
|
let config = stack.get_config()?;
|
||||||
|
let invert = call.has_flag("invert");
|
||||||
|
|
||||||
let terms = call.rest::<Value>(&engine_state, stack, 0)?;
|
let terms = call.rest::<Value>(&engine_state, stack, 0)?;
|
||||||
let lower_terms = terms
|
let lower_terms = terms
|
||||||
@ -277,7 +313,7 @@ fn find_with_rest(
|
|||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
Value::Binary { .. } => false,
|
Value::Binary { .. } => false,
|
||||||
})
|
}) != invert
|
||||||
},
|
},
|
||||||
ctrlc,
|
ctrlc,
|
||||||
)?;
|
)?;
|
||||||
|
Loading…
Reference in New Issue
Block a user