update str find-replace to str replace (#5120)

This commit is contained in:
Darren Schroeder 2022-04-07 08:41:09 -05:00 committed by GitHub
parent 690ec9abfa
commit 4129f15eb9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 97 additions and 25 deletions

View File

@ -166,7 +166,7 @@ pub fn create_default_context(cwd: impl AsRef<Path>) -> EngineState {
StrContains, StrContains,
StrDowncase, StrDowncase,
StrEndswith, StrEndswith,
StrFindReplace, StrReplace,
StrIndexOf, StrIndexOf,
StrKebabCase, StrKebabCase,
StrLength, StrLength,
@ -370,6 +370,7 @@ pub fn create_default_context(cwd: impl AsRef<Path>) -> EngineState {
MatchDeprecated, MatchDeprecated,
NthDeprecated, NthDeprecated,
UnaliasDeprecated, UnaliasDeprecated,
StrFindReplaceDeprecated,
}; };
#[cfg(feature = "dataframe")] #[cfg(feature = "dataframe")]

View File

@ -3,6 +3,7 @@ mod nth;
mod pivot; mod pivot;
mod str_datetime; mod str_datetime;
mod str_decimal; mod str_decimal;
mod str_find_replace;
mod str_int; mod str_int;
mod unalias; mod unalias;
@ -11,6 +12,7 @@ pub use nth::NthDeprecated;
pub use pivot::PivotDeprecated; pub use pivot::PivotDeprecated;
pub use str_datetime::StrDatetimeDeprecated; pub use str_datetime::StrDatetimeDeprecated;
pub use str_decimal::StrDecimalDeprecated; pub use str_decimal::StrDecimalDeprecated;
pub use str_find_replace::StrFindReplaceDeprecated;
pub use str_int::StrIntDeprecated; pub use str_int::StrIntDeprecated;
pub use unalias::UnaliasDeprecated; pub use unalias::UnaliasDeprecated;

View File

@ -0,0 +1,36 @@
use nu_protocol::{
ast::Call,
engine::{Command, EngineState, Stack},
Category, PipelineData, Signature,
};
#[derive(Clone)]
pub struct StrFindReplaceDeprecated;
impl Command for StrFindReplaceDeprecated {
fn name(&self) -> &str {
"str find-replace"
}
fn signature(&self) -> Signature {
Signature::build(self.name()).category(Category::Deprecated)
}
fn usage(&self) -> &str {
"Deprecated command"
}
fn run(
&self,
_engine_state: &EngineState,
_stack: &mut Stack,
call: &Call,
_input: PipelineData,
) -> Result<nu_protocol::PipelineData, nu_protocol::ShellError> {
Err(nu_protocol::ShellError::DeprecatedCommand(
self.name().to_string(),
"str replace".to_string(),
call.head,
))
}
}

View File

@ -14,7 +14,7 @@ use crate::To;
#[cfg(test)] #[cfg(test)]
use super::{ use super::{
Ansi, Date, From, If, Into, Math, Path, Random, Split, SplitColumn, SplitRow, Str, StrCollect, Ansi, Date, From, If, Into, Math, Path, Random, Split, SplitColumn, SplitRow, Str, StrCollect,
StrFindReplace, StrLength, Url, Wrap, StrLength, StrReplace, Url, Wrap,
}; };
#[cfg(test)] #[cfg(test)]
@ -31,7 +31,7 @@ pub fn test_examples(cmd: impl Command + 'static) {
working_set.add_decl(Box::new(Str)); working_set.add_decl(Box::new(Str));
working_set.add_decl(Box::new(StrCollect)); working_set.add_decl(Box::new(StrCollect));
working_set.add_decl(Box::new(StrLength)); working_set.add_decl(Box::new(StrLength));
working_set.add_decl(Box::new(StrFindReplace)); working_set.add_decl(Box::new(StrReplace));
working_set.add_decl(Box::new(BuildString)); working_set.add_decl(Box::new(BuildString));
working_set.add_decl(Box::new(From)); working_set.add_decl(Box::new(From));
working_set.add_decl(Box::new(If)); working_set.add_decl(Box::new(If));

View File

@ -67,7 +67,7 @@ impl Command for Reduce {
}), }),
}, },
Example { Example {
example: r#"[ i o t ] | reduce -f "Arthur, King of the Britons" {|it, acc| $acc | str find-replace -a $it "X" }"#, example: r#"[ i o t ] | reduce -f "Arthur, King of the Britons" {|it, acc| $acc | str replace -a $it "X" }"#,
description: "Replace selected characters in a string with 'X'", description: "Replace selected characters in a string with 'X'",
result: Some(Value::String { result: Some(Value::String {
val: "ArXhur, KXng Xf Xhe BrXXXns".to_string(), val: "ArXhur, KXng Xf Xhe BrXXXns".to_string(),

View File

@ -4,10 +4,10 @@ mod collect;
mod contains; mod contains;
mod downcase; mod downcase;
mod ends_with; mod ends_with;
mod find_replace;
mod index_of; mod index_of;
mod length; mod length;
mod lpad; mod lpad;
mod replace;
mod reverse; mod reverse;
mod rpad; mod rpad;
mod starts_with; mod starts_with;
@ -21,10 +21,10 @@ pub use collect::*;
pub use contains::SubCommand as StrContains; pub use contains::SubCommand as StrContains;
pub use downcase::SubCommand as StrDowncase; pub use downcase::SubCommand as StrDowncase;
pub use ends_with::SubCommand as StrEndswith; pub use ends_with::SubCommand as StrEndswith;
pub use find_replace::SubCommand as StrFindReplace;
pub use index_of::SubCommand as StrIndexOf; pub use index_of::SubCommand as StrIndexOf;
pub use length::SubCommand as StrLength; pub use length::SubCommand as StrLength;
pub use lpad::SubCommand as StrLpad; pub use lpad::SubCommand as StrLpad;
pub use replace::SubCommand as StrReplace;
pub use reverse::SubCommand as StrReverse; pub use reverse::SubCommand as StrReverse;
pub use rpad::SubCommand as StrRpad; pub use rpad::SubCommand as StrRpad;
pub use starts_with::SubCommand as StrStartsWith; pub use starts_with::SubCommand as StrStartsWith;

View File

@ -1,11 +1,10 @@
use nu_engine::CallExt; use nu_engine::CallExt;
use nu_protocol::ast::Call; use nu_protocol::{
use nu_protocol::ast::CellPath; ast::{Call, CellPath},
use nu_protocol::engine::{Command, EngineState, Stack}; engine::{Command, EngineState, Stack},
use nu_protocol::Category; Category, Example, PipelineData, ShellError, Signature, Span, Spanned, SyntaxShape, Value,
use nu_protocol::Spanned; };
use nu_protocol::{Example, PipelineData, ShellError, Signature, Span, SyntaxShape, Value}; use regex::{NoExpand, Regex};
use regex::Regex;
use std::sync::Arc; use std::sync::Arc;
struct Arguments { struct Arguments {
@ -13,6 +12,7 @@ struct Arguments {
find: String, find: String,
replace: String, replace: String,
column_paths: Vec<CellPath>, column_paths: Vec<CellPath>,
literal_replace: bool,
} }
#[derive(Clone)] #[derive(Clone)]
@ -20,11 +20,11 @@ pub struct SubCommand;
impl Command for SubCommand { impl Command for SubCommand {
fn name(&self) -> &str { fn name(&self) -> &str {
"str find-replace" "str replace"
} }
fn signature(&self) -> Signature { fn signature(&self) -> Signature {
Signature::build("str find-replace") Signature::build("str replace")
.required("find", SyntaxShape::String, "the pattern to find") .required("find", SyntaxShape::String, "the pattern to find")
.required("replace", SyntaxShape::String, "the replacement pattern") .required("replace", SyntaxShape::String, "the replacement pattern")
.rest( .rest(
@ -33,6 +33,11 @@ impl Command for SubCommand {
"optionally find and replace text by column paths", "optionally find and replace text by column paths",
) )
.switch("all", "replace all occurrences of find string", Some('a')) .switch("all", "replace all occurrences of find string", Some('a'))
.switch(
"no-expand",
"do not expand the replace parameter as a regular expression",
Some('n'),
)
.category(Category::Strings) .category(Category::Strings)
} }
@ -54,7 +59,7 @@ impl Command for SubCommand {
vec![ vec![
Example { Example {
description: "Find and replace contents with capture group", description: "Find and replace contents with capture group",
example: "'my_library.rb' | str find-replace '(.+).rb' '$1.nu'", example: "'my_library.rb' | str replace '(.+).rb' '$1.nu'",
result: Some(Value::String { result: Some(Value::String {
val: "my_library.nu".to_string(), val: "my_library.nu".to_string(),
span: Span::test_data(), span: Span::test_data(),
@ -62,7 +67,7 @@ impl Command for SubCommand {
}, },
Example { Example {
description: "Find and replace all occurrences of find string", description: "Find and replace all occurrences of find string",
example: "'abc abc abc' | str find-replace -a 'b' 'z'", example: "'abc abc abc' | str replace -a 'b' 'z'",
result: Some(Value::String { result: Some(Value::String {
val: "azc azc azc".to_string(), val: "azc azc azc".to_string(),
span: Span::test_data(), span: Span::test_data(),
@ -71,7 +76,7 @@ impl Command for SubCommand {
Example { Example {
description: "Find and replace all occurrences of find string in table", description: "Find and replace all occurrences of find string in table",
example: example:
"[[ColA ColB ColC]; [abc abc ads]] | str find-replace -a 'b' 'z' ColA ColC", "[[ColA ColB ColC]; [abc abc ads]] | str replace -a 'b' 'z' ColA ColC",
result: Some(Value::List { result: Some(Value::List {
vals: vec![Value::Record { vals: vec![Value::Record {
cols: vec!["ColA".to_string(), "ColB".to_string(), "ColC".to_string()], cols: vec!["ColA".to_string(), "ColB".to_string(), "ColC".to_string()],
@ -94,6 +99,15 @@ impl Command for SubCommand {
span: Span::test_data(), span: Span::test_data(),
}), }),
}, },
Example {
description: "Find and replace contents without using the replace parameter as a regular expression",
example: r#"'dogs_$1_cats' | str replace '\$1' '$2' -n"#,
result: Some(Value::String {
val: "dogs_$2_cats".to_string(),
span: Span::test_data(),
}),
},
] ]
} }
} }
@ -106,12 +120,14 @@ fn operate(
) -> Result<PipelineData, ShellError> { ) -> Result<PipelineData, ShellError> {
let find: Spanned<String> = call.req(engine_state, stack, 0)?; let find: Spanned<String> = call.req(engine_state, stack, 0)?;
let replace: Spanned<String> = call.req(engine_state, stack, 1)?; let replace: Spanned<String> = call.req(engine_state, stack, 1)?;
let literal_replace = call.has_flag("no-expand");
let options = Arc::new(Arguments { let options = Arc::new(Arguments {
all: call.has_flag("all"), all: call.has_flag("all"),
find: find.item, find: find.item,
replace: replace.item, replace: replace.item,
column_paths: call.rest(engine_state, stack, 2)?, column_paths: call.rest(engine_state, stack, 2)?,
literal_replace,
}); });
let head = call.head; let head = call.head;
input.map( input.map(
@ -142,7 +158,11 @@ struct FindReplace<'a>(&'a str, &'a str);
fn action( fn action(
input: &Value, input: &Value,
Arguments { Arguments {
find, replace, all, .. find,
replace,
all,
literal_replace,
..
}: &Arguments, }: &Arguments,
head: Span, head: Span,
) -> Value { ) -> Value {
@ -155,12 +175,24 @@ fn action(
Ok(re) => { Ok(re) => {
if *all { if *all {
Value::String { Value::String {
val: re.replace_all(val, replacement).to_string(), val: {
if *literal_replace {
re.replace_all(val, NoExpand(replacement)).to_string()
} else {
re.replace_all(val, replacement).to_string()
}
},
span: head, span: head,
} }
} else { } else {
Value::String { Value::String {
val: re.replace(val, replacement).to_string(), val: {
if *literal_replace {
re.replace(val, NoExpand(replacement)).to_string()
} else {
re.replace(val, replacement).to_string()
}
},
span: head, span: head,
} }
} }
@ -206,6 +238,7 @@ mod tests {
find: String::from("Cargo.(.+)"), find: String::from("Cargo.(.+)"),
replace: String::from("Carga.$1"), replace: String::from("Carga.$1"),
column_paths: vec![], column_paths: vec![],
literal_replace: false,
all: false, all: false,
}; };

View File

@ -165,7 +165,7 @@ fn find_and_replaces() {
cwd: dirs.test(), pipeline( cwd: dirs.test(), pipeline(
r#" r#"
open sample.toml open sample.toml
| str find-replace KATZ "5289" fortune.teller.phone | str replace KATZ "5289" fortune.teller.phone
| get fortune.teller.phone | get fortune.teller.phone
"# "#
)); ));
@ -190,7 +190,7 @@ fn find_and_replaces_without_passing_field() {
r#" r#"
open sample.toml open sample.toml
| get fortune.teller.phone | get fortune.teller.phone
| str find-replace KATZ "5289" | str replace KATZ "5289"
"# "#
)); ));

View File

@ -7,7 +7,7 @@ module completions {
# #
# This is a simplified version of completions for git branches and git remotes # This is a simplified version of completions for git branches and git remotes
def "nu-complete git branches" [] { def "nu-complete git branches" [] {
^git branch | lines | each { |line| $line | str find-replace '[\*\+] ' '' | str trim } ^git branch | lines | each { |line| $line | str replace '[\*\+] ' '' | str trim }
} }
def "nu-complete git remotes" [] { def "nu-complete git remotes" [] {

View File

@ -14,7 +14,7 @@ fn plugins_are_declared_with_wix() {
r#" r#"
open Cargo.toml open Cargo.toml
| get bin.name | get bin.name
| str find-replace "nu_plugin_(extra|core)_(.*)" "nu_plugin_$2" | str replace "nu_plugin_(extra|core)_(.*)" "nu_plugin_$2"
| drop | drop
| sort-by | sort-by
| wrap cargo | merge { | wrap cargo | merge {