diff --git a/crates/nu-command/src/formats/to/text.rs b/crates/nu-command/src/formats/to/text.rs index b1c1fdb1ba..3b365d6649 100644 --- a/crates/nu-command/src/formats/to/text.rs +++ b/crates/nu-command/src/formats/to/text.rs @@ -21,6 +21,11 @@ impl Command for ToText { fn signature(&self) -> Signature { Signature::build("to text") .input_output_types(vec![(Type::Any, Type::String)]) + .switch( + "no-newline", + "Do not append a newline to the end of the text", + Some('n'), + ) .category(Category::Formats) } @@ -36,6 +41,7 @@ impl Command for ToText { input: PipelineData, ) -> Result { let span = call.head; + let no_newline = call.has_flag(engine_state, stack, "no-newline")?; let input = input.try_expand_range()?; let config = stack.get_config(engine_state); @@ -43,7 +49,12 @@ impl Command for ToText { PipelineData::Empty => Ok(Value::string(String::new(), span) .into_pipeline_data_with_metadata(update_metadata(None))), PipelineData::Value(value, ..) => { - let str = local_into_string(value, LINE_ENDING, &config); + let is_compound_type = matches!(value, Value::List { .. } | Value::Record { .. }); + let mut str = local_into_string(value, LINE_ENDING, &config); + if is_compound_type && !no_newline { + str.push_str(LINE_ENDING); + } + Ok( Value::string(str, span) .into_pipeline_data_with_metadata(update_metadata(None)), @@ -53,7 +64,9 @@ impl Command for ToText { let span = stream.span(); let iter = stream.into_inner().map(move |value| { let mut str = local_into_string(value, LINE_ENDING, &config); - str.push_str(LINE_ENDING); + if !no_newline { + str.push_str(LINE_ENDING); + } str }); Ok(PipelineData::ByteStream( @@ -75,8 +88,13 @@ impl Command for ToText { fn examples(&self) -> Vec { vec![ Example { - description: "Outputs data as simple text", - example: "1 | to text", + description: "Outputs data as simple text with a newline", + example: "[1] | to text", + result: Some(Value::test_string("1".to_string() + LINE_ENDING)), + }, + Example { + description: "Outputs data as simple text without a newline", + example: "[1] | to text --no-newline", result: Some(Value::test_string("1")), }, Example { diff --git a/crates/nu-command/tests/commands/save.rs b/crates/nu-command/tests/commands/save.rs index 85076099bf..6b77160bee 100644 --- a/crates/nu-command/tests/commands/save.rs +++ b/crates/nu-command/tests/commands/save.rs @@ -415,7 +415,7 @@ fn save_with_custom_converter() { nu!(cwd: dirs.test(), pipeline( r#" - def "to ndjson" []: any -> string { each { to json --raw } | to text } ; + def "to ndjson" []: any -> string { each { to json --raw } | to text --no-newline } ; {a: 1, b: 2} | save test.ndjson "# ));