【问题标题】:How can I remove directory paths listed in a text file but keep the file paths?如何删除文本文件中列出的目录路径但保留文件路径?
【发布时间】:2021-12-11 09:01:50
【问题描述】:

我有一个包含数千行的文本文件,其中包含目录路径和文件路径。 我想遍历文本文件的每一行并删除任何包含目录路径的行,并保留所有包含文件路径的行。两行示例(一个目录,一个来自文本文件的路径):

exampleDirectoryPath/tags/10.0.0.8/tools/
exampleFilePath/tags/10.0.0.8/tools/hello.txt

到目前为止,要遍历文本文件,我有:

foreach ($line in [System.IO.File]::ReadLines("file.txt")) {
    if ($line -match ".*/.*$") {
        $line
    }
}

目标输出:

exampleFilePath/tags/10.0.0.8/tools/hello.txt

注意:我不想硬编码文件扩展名。有数千个文件要遍历,我不知道存在哪些扩展名,所以我想全部返回。

【问题讨论】:

    标签: regex powershell text


    【解决方案1】:

    所以,这里的基本逻辑很简单:

    Get-Content "file.txt" | where { $_ is a file path... }
    

    这取决于你想如何确定它是否是文件路径

    如果你所有的目录路径都以“/”结尾,你可以这样做:

    where { -not $_.EndsWith("/") }
    

    或:

    where { [system.io.Path]::GetFileName($_) -eq "" }
    

    如果没有,但您的所有文件路径肯定都有扩展名,您可以这样做:

    where { [system.io.Path]::GetExtension($_) -ne "" }
    

    如果所有路径都实际存在,您也可以这样做:

    where { Test-Path $_ -Type Leaf }
    

    【讨论】:

    • 谢谢。我将 where { $_.EndsWith("/") } 更改为 where { ! $_.EndsWith("/") } - 这确保它返回的是文件,而不是文件夹。
    • 虽然这是一个很好、简洁的答案,但我只是想补充一点,根据您的用例,您应该注意您对该方法的依赖程度。请参阅此讨论以了解有关此问题的一些细微差别的良好入门:stackoverflow.com/questions/980255/… TL;DR - 无法 100% 确定纯粹从其路径字符串中确定某个文件是否是文件,并且在某些情况下,尾部斜杠可能意味着不同的东西。尤其是。如果使用这个跨平台要小心
    【解决方案2】:

    提供一个简洁的解决方案,也表现良好:

    (Get-Content -ReadCount 0 file.txt) -notmatch '\\$'
    
    • -ReadCount 0Get-Content 一起使用是一种性能优化,它将输入文件中的所有行作为单个数组对象返回,而不是逐行收集。

      • 此外,-ReadCount 0 确保输出 array,即使输入文件恰好只有 一个 行。
    • -notmatch,基于regex-match operator 的否定形式,充当具有数组 值LHS 的过滤器,返回(非) 匹配元素(行)(作为新数组)。

      • 正则表达式 \\$ 与每个输入字符串(行)末尾 ($) 的逐字匹配 \

    注意:正如您的问题所暗示的,上述解决方案假定目录可以与文件正式区分开来,具体取决于输入文件中的行是否以/ 结尾。

    【讨论】:

      【解决方案3】:

      我个人不会为此使用regex,原因很简单,即使您可以验证路径的模式是否与文件或文件夹的模式匹配,但它无法验证它是否确实存在。我会在你的代码之后使用它:

      $result = foreach($line in [System.IO.File]::ReadLines("file.txt"))
      {
          if(([System.IO.DirectoryInfo]$line).Attributes -eq 'Archive')
          {
              $line
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-10
        • 2012-10-13
        • 2011-09-01
        • 2019-08-18
        • 2015-03-04
        相关资源
        最近更新 更多