【问题标题】:How to truncate text in string after/before separator in PowerShell如何在PowerShell中的分隔符之后/之前截断字符串中的文本
【发布时间】:2011-07-09 09:23:51
【问题描述】:

我想制作一个 PowerShell 脚本,它获取我音乐库中的每个文件,然后对其进行哈希求和并将其写入文件中,如下所示:

test.txt ; 131 136 80 89 119 17 60 123 210 121 188 42 136 200 131 198

当我启动脚本时,我需要它首先将我的音乐库与已经存在的值进行比较,但为此我只想切断; 之后的所有内容,以便它可以将文件名与文件名(或文件路径)进行比较)...但我不知道该怎么做。

我尝试通过$name = $name -replace ";*","" 替换该值,但这不起作用。我也尝试过过滤...但我不知道如何。

【问题讨论】:

    标签: string powershell


    【解决方案1】:
    $pos = $name.IndexOf(";")
    $leftPart = $name.Substring(0, $pos)
    $rightPart = $name.Substring($pos+1)
    

    在内部,PowerShell 使用 String class

    【讨论】:

      【解决方案2】:
      $text = "test.txt ; 131 136 80 89 119 17 60 123 210 121 188 42 136 200 131 198"
      
      $text.split(';')[1].split(' ')
      

      【讨论】:

        【解决方案3】:

        您可以使用 Split

        $text = "test.txt ; 131 136 80 89 119 17 60 123 210 121 188 42 136 200 131 198"
        $separator = ";" # you can put many separator like this "; : ,"
        
        $parts = $text.split($separator)
        
        echo $parts[0] # return test.txt
        echo $parts[1] # return the part after the separator
        

        【讨论】:

          【解决方案4】:

          $name -replace ";*",""

          您很接近,但您使用了 wildcard expresson 的语法,而不是 regular expression,这是 -replace operator 所期望的。

          因此(哈希序列缩短):

          PS> 'test.txt ; 131 136 80 89 119 17 60 123 210 121 188' -replace '\s*;.*'
          test.txt
          

          注意:

          • 省略替换文本操作数(第二个 RHS 操作数)隐式使用 ""(空字符串),即它有效地删除正则表达式匹配的内容。

          • .* 表示正则表达式中字符 (.) 的潜在空运行 (*) - 它是 * 的正则表达式等价物本身在通配符表达式中。

          • 在正则表达式中的 ; 之前添加 \s* 也会删除文件名之后的尾随空格 (\s)。

          • 我使用 '...' 而不是 "..." 来包含正则表达式,以防止 PowerShell 预先扩展的内容之间出现混淆(请参阅 expandable strings in PowerShell 和 .NET 正则表达式引擎看到的内容。

          【讨论】:

            【解决方案5】:

            这确实适用于分隔符之间特定数量的字符的特定分隔符。我有很多问题试图在位置改变但分隔符相同的每个循环中使用它。例如,我使用反斜杠作为分隔符,并且只想使用反斜杠右侧的所有内容。问题是,一旦定义了位置(从头开始的 71 个字符),它每次都会使用 $pos 作为 71,而不管分隔符在脚本中的实际位置。我找到了另一种使用分隔符和 .split 来分解事物的方法,然后使用 split 变量来调用各个部分。例如,第一部分是 $variable[0],第二部分是 $variable[1]。

            【讨论】:

              【解决方案6】:

              我有一个充满文件的目录,其中包括一些名为 invoice no-product no.pdf 的文件,我想按产品编号对这些文件进行排序,所以...

              get-childitem *.pdf | sort-object -property @{expression={$\_.name.substring($\_.name.indexof("-")+1)}}
              

              请注意,如果没有 -,则按 $_.name 排序

              【讨论】:

                【解决方案7】:

                使用正则表达式,结果在$matches[1]中:

                $str = "test.txt ; 131 136 80 89 119 17 60 123 210 121 188 42 136 200 131 198"
                $str -match "^(.*?)\s\;"
                $matches[1]
                test.txt
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2022-10-05
                  • 1970-01-01
                  • 2016-03-13
                  • 1970-01-01
                  • 2023-04-05
                  • 2011-10-11
                  • 2021-04-26
                  相关资源
                  最近更新 更多