替换powershell中变量的一部分而不替换其余部分?

时间:2019-06-16 11:42:01

标签: powershell replace copy ps1

因此,我拥有此PowerShell脚本,该脚本将通过将"https://www.youtube.com/watch?v="替换为"id="而不替换URL ID来替换Youtube URL。

示例:
之前的电子白板变量:https://www.youtube.com/watch?v=FigUL6NWtqw
电子白板变量,然后:id=FigUL6NWtqw

这是我已经尝试过的:

powershell

$Copyboard = Get-Clipboard | Out-String
$Copyboard = $Copyboard -replace "https://www.youtube.com/watch?v=", "id="

3 个答案:

答案 0 :(得分:2)

可使用正则表达式-Replace运算符获得结果。这样会用=替换所有内容,直到第一个id字符为止。

$Copyboard = $Copyboard -Replace "^[^=]+","id"

使用-Split运算符,可以在查询值前加上id=。我使用=字符作为分隔符,并返回带有=索引的[1]之后的所有数据。在这里,我使用了格式运算符(-f),但是您可以使用选择的任何串联技术。

$Copyboard = "{0}{1}" -f 'id=',($Copyboard -Split "=")[1]

另一种方法是首先将$Copyboard转换为[uri],只有在您不为$Copyboard重新赋新值的情况下,以后才能为代码打开其他选项。然后访问要更改的属性(在这种情况下为query),仅输出更改后的属性。对于uri对象,将复制的uri的不同部分分解为多个子部分,并将得到的子部分存储为对象的属性。

将regex -Replace运算符与uri对象一起使用:

([uri]$copyboard).Query -Replace "^[^=]+","id"

答案 1 :(得分:1)

源字符串“。”中有一些正则表达式字符。和“?”。大多数情况下,问号让您感到困惑。 (不带“ |字符串”)

x <- data.frame(
    "type" = c("new", "new", "old", "old", "new", "new", "old", "old"), 
    "date" = as.Date(c("2018-01-01", "2018-01-01", "2018-01-01", "2018-01-01", "2018-01-08", "2018-01-08", "2018-01-08", "2018-01-08")),
    "score" = c("1.5", "2.5", "2.6", "3.7", "5.2", "8.6", "5.2", "8.6"),
    "category" = c("actual", "predicted", "actual", "predicted", "actual", "predicted", "actual", "predicted"),
    stringsAsFactors = F)

  library(ggplot2)

  ggplot(x, aes(x=date, y=score, group = paste(category, type), linetype = category, colour = paste(category, type))) + 
    geom_line(size = 1.25) +
    scale_color_manual(
      values = c("#4286f4", "#f9026d", "#4286f4", "#f9026d")
    )

您可以使用转义版本:

$a = 'https://www.youtube.com/watch?v=FigUL6NWtqw'     
[regex]::escape('https://www.youtube.com/watch?v=')                   

https://www\.youtube\.com/watch\?v=

或反斜杠?:

$a -replace [regex]::escape('https://www.youtube.com/watch?v='), 'id='

或者不使用正则表达式的.net .replace():

$a -replace 'https://www.youtube.com/watch\?v=', 'id='

答案 2 :(得分:0)

听起来您只需要从输入字符串中提取最后一个基于=的令牌,这是使用-split运算符最容易(尽管不是最快)的方法:

$Copyboard = 'id=' + ((Get-Clipboard -Format Text) -split '=')[-1]

请注意使用-Format Text来确保从剪贴板中检索到文本

索引[-1]从令牌数组中检索 last 元素,该元素是通过用=将字符串-split '='拆分为FigUL6NWtqw而得到的}和您的示例输入。

顺便说一句:这里没有什么区别,但是请注意,PowerShell的-split operator 与.NET .Split() method 不同由正则表达式组成,通常比.Split()更强大-请参见this answer