powershell:从字符串末尾删除文本

时间:2011-04-29 11:35:57

标签: powershell

- 删除了之前的文字 - 我问了错误的问题!

...啊哈

我所拥有的是$var = "\\unknowntext1\alwaysSame\unknowntext2"

我只需保留"\\unknowntext1"

3 个答案:

答案 0 :(得分:6)

尝试正则表达式:

$foo = 'something_of_unknown' -replace 'something.*','something'

或者如果你只知道'某事'的部分内容,那么就是

'something_of_unknown' -replace '(some[^_]*).*','$1'
'some_of_unknown' -replace '(some[^_]*).*','$1'
'somewhatever_of_unknown' -replace '(some[^_]*).*','$1'

$1是对括号内的组的引用((some[^_]*)部分)。

修改(更改后的问题):

如果您使用正则表达式,则需要转义特殊字符:

"\\unknowntext1\alwaysSame\unknowntext2" -replace '\\\\unknowntext1.*', '\\unknowntext1'

或(另一个正则表达式魔法)使用这样的lookbehind:

"\\unknowntext1\alwaysSame\unknowntext2" -replace '(?<=\\\\unknowntext1).*', ''

(即:取任何内容(.*),但前面必须有\\unknowntext1'(?<=\\\\unknowntext1))并将其替换为空字符串。

修改(最后)

如果你知道中间有一些已知的东西(alwaysSame),这可能会有所帮助:

"\\unknowntext1\alwaysSame\unknowntext2" -replace '(.*?)\\alwaysSame.*', '$1'

答案 1 :(得分:5)

function Remove-TextAfter {   
    param (
        [Parameter(Mandatory=$true)]
        $string, 
        [Parameter(Mandatory=$true)]
        $value,
        [Switch]$Insensitive
    )

    $comparison = [System.StringComparison]"Ordinal"
    if($Insensitive) {
        $comparison = [System.StringComparison]"OrdinalIgnoreCase"
    }

    $position = $string.IndexOf($value, $comparison)

    if($position -ge 0) {
        $string.Substring(0, $position + $value.Length)
    }
}

Remove-TextAfter "something_of_unknown" "SoMeThInG" -Insensitive

答案 2 :(得分:3)

  

我所拥有的是$ var =&#34; \ unknowntext1 \ alwaysSame \ unknowntext2&#34;

     

我只需要保留&#34; \ unknowntext1&#34;

不确定这需要正则表达式。假设alwaysSame实际上始终是相同的,正如围绕stej的回答所暗示的那样,到目前为止,最直接的方法似乎是:

$var.substring(0, $var.indexOf("\alwaysSame"));