【问题标题】:Extract last string with delimiter '/' from a file从文件中提取带有分隔符'/'的最后一个字符串
【发布时间】:2014-11-17 01:54:35
【问题描述】:

我有一个文本文件,其中包含一组 UNIX PATH 格式的字符串。我需要从每个由'/'分隔的字符串中提取最后一个字符串。

/Public/Home/Call/Reports/Weekly Template/C555 Weekly Report - Monday
/Public/Home/Call/Reports/Weekly Template/C567 Weekly Report - Monday
/Public/Home/Call/Reports/Weekly Template/C555 Weekly Report - Tuesday
/Public/Home/Claim Repo/Reports/Weekly Set/@Weekly Report - $100 for Monday
/Public/Home/Claim Report/Reports/Weekly Not Set/ Weekly Report - Monday

我需要在 Windows 机器上运行这些,因此需要在 PowerShell 或批处理上运行。 我需要帮助来编写允许空格和特殊字符的脚本,它可以读取 .TXT 文件并以以下格式输出完整的字符串:

/Public/Home/Call/Reports/Weekly Template       C555 Weekly Report - Monday
/Public/Home/Call/Reports/Weekly Template       C567 Weekly Report - Monday
/Public/Home/Call/Reports/Weekly Template       C555 Weekly Report - Tuesday
/Public/Home/Claim Repo/Reports/Weekly Set      @Weekly Report - $100 for Monday
/Public/Home/Claim Report/Reports/Weekly Not Set     Weekly Report - Monday

我在另一个答案中找到了一个解决方案:

http://stackoverflow.com/questions/20004597/extracting-string-after-last-instance-of-delimiter-in-a-batch-file

代码如下:

for %%a in (%param:\= %) do set lastDir=%%a
:nextParam
   set "param=%~1"
   if not defined param goto endParams
   for %%a in (%param:\= %) do set lastDir=%%a
   echo Last dir: %lastDir%
   shift
goto nextParam
:endParams

或者,以更简单的方式(没有空格限制):

:nextParam
   if "%~1" equ "" goto endParams
   echo Last dir: %~N1
   shift
goto nextParam
:endParams

但是,我希望同时满足字符串中的空格和特殊字符,而上面没有做到这一点。

【问题讨论】:

    标签: regex string powershell split delimiter


    【解决方案1】:

    在 PowerShell 中,您可以这样做:

    Get-Content foo.txt | Where {$_ -match '/'} | Foreach {$_.Substring($_.LastIndexOf('/')+1)}
    

    管道的Where阶段是过滤掉空行和否则不指定路径的行。

    【讨论】:

    • 如何获取初始字符串?我想以初始字符串 最终字符串的格式...
    • 初始字符串在 Foreach 脚本块中,由$_ 表示。
    【解决方案2】:

    如果有用就试试这个

    (get-content foo.txt) -replace '.*/'
    

    解释:'.*/' : 吃掉所有字符直到字符串中的最后一个位置,然后回溯直到找到第一个'/'

    |a|b|/|c|/|d|
    ---------|-->
             | <-
             |<--
    

    【讨论】:

    • -match 返回布尔值 True 或 False - 不是字符串。
    • @KeithHill:代码未经测试,但您可以避免在此处使用匹配运算符
    • @walidtoumi:我如何获得字符串的第一部分?我可以将其提取到单独的文件中吗?
    • 我希望有 2 个字符串 - (i) /Public/Home/Call/Reports/Weekly Template 和 (ii) C555 Weekly Report - Monday
    • @gagneet:你可以通过这个$data -replace '/(?!.*/).*'获得第一部分
    猜你喜欢
    • 2013-11-29
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多