【问题标题】:How to make Split not add a newline at the end of each element如何使拆分不在每个元素的末尾添加换行符
【发布时间】:2017-01-22 06:17:56
【问题描述】:
$var="The quick brown fox"
$words = $var.Split(" ", [StringSplitOptions]::None)
echo $words[0] $words[2]

这个程序的输出是

The
brown

为什么.Split() 在输出的每个元素的末尾添加一个换行符? 我怎样才能防止这种情况发生?

我希望输出是

The brown

【问题讨论】:

  • FWIW 数组索引选择器很方便:echo ($words[0,2] -join ' ') 尤其适用于两个以上的元素。
  • 重要的一点,仅在其中一个答案中提到,是 PowerShell 进行实际拆分的方式只是 $words = -split $var。无需调用 .NET Split 方法。

标签: arrays string powershell split


【解决方案1】:

echoWrite-Output 的别名)“添加”了它,如果您将其修改为

echo ($words[0] + " " + $words[2])

这将导致

The brown  

本质上发生的是,您在管道中输出 2 个对象(字符串),每个对象都显示在自己的行中

如果你只是想打印一些东西而不把它放到管道中,你可以使用

Write-Host $words[0] $words[2]

【讨论】:

  • 你是对的 - 但我不明白 - $($words[0]) 是什么 - 为什么是 2$?为什么 ()?如果我从你的陈述中删除双引号 - 它再次进入不同的行
  • @user93353 这是一个子表达式,以确保数组元素部分被理解并且不被视为字符串的一部分。子表达式由$() 表示
  • @Matt 感谢您的解释。但是我更新了我的答案,因为我认为在这种情况下简单的+ 更具可读性:)
  • 这完全取决于 OP 想要做什么。子表达式对于较长的字符串非常有用。也可以使用格式运算符……无限可能。
【解决方案2】:

为什么 .Split() 会在输出的每个元素末尾添加一个换行符?

因为如果对文本使用它会创建字符串数组:

当对文本文件或命令的字符串输出使用 Split() 时,您正在处理一个数组。 PowerShell 自动将文本文件的每一行转换为数组的一个元素。

(来自SS64

从字符串数组创建单个字符串的唯一方法是加入它们:

$words = $var.Split(" ", [StringSplitOptions]::None) -join ' ' # joining symbol

顺便说一句,空格/换行符/制表符是默认的拆分符号。所以你可以稍微简化你的代码:

$words = $var.Split() -join ' '

【讨论】:

  • 根据您的阅读方式,这就像您建议拆分负责新行。当然不是。这是处理它的好方法,但根本问题不是拆分,而是 OP 如何输出。
  • @Matt 这些不是“新行”符号之类的。这些是在 PS 控制台中显示在新行上的单独字符串。
  • 我知道...操作已经认为它的拆分错误并且正在添加新行。不是,这是我的观点。
【解决方案3】:

Split 没有放入换行符,它是默认的输出格式,因为传递给 echo 的每个对象都是单独编写的。连接单词的一种紧凑方法是在双引号内使用数组表达式的插值。

echo "$($words[0,2])"

这样的插值数组表达式是使用变量$OFS 的值连接起来的,默认情况下是一个空格。

附:您甚至不需要echo 命令,只需将带引号的字符串单独放在一行中即可输出。

为了好玩,这里有一个可以做你想做的事情,不需要变量$words

"$((-split $var)[0,2])"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 2021-01-21
    相关资源
    最近更新 更多