【问题标题】:Remove All Values In A String Before 7th backslash在第 7 个反斜杠之前删除字符串中的所有值
【发布时间】:2015-06-02 06:28:36
【问题描述】:

我在一个 txt 文件中有一个需要操作的路径,例如:

C:\Jenkins\Automation\Blah\Foo\Bar\646433\Schema\test\473289_12321.ps1 C:\Jenkins\Automation\Blah\Foo\Bar\2112\Schema\QA\473289_123211.ps1

我想替换第 7 个反斜杠之前的所有内容,然后将其替换为 C:\Question。我正在通过以下方式在 Powershell 中做类似的事情:

(Get-Content $FullEnvSQLFilePath) |  #get the content
Foreach-Object {$_ -replace [Regex]::Escape($StringToReplace), "$StringReplaceValue"} | #look for the string and replace

当我知道要查找的确切措辞时,这很好用。我们现在不知道这一点,但我们希望删除第 7 个反斜杠之前的所有内容并将其替换为一个值。倒序也可以。通过子字符串执行此操作,我无法在 Powershell 中获得太多运气。谢谢。

【问题讨论】:

  • 为什么限制为第 7 个反斜杠?如果您将您的 powershell 脚本重新定位到其他地方,您将不得不使用第 6 个反斜杠。我会说查看here 以获取到某个根位置的相对路径,然后您可以使用该路径形成正确的目标位置,例如here
  • 谢谢 Vesper,让我看看。

标签: powershell


【解决方案1】:

一个选项:

$text = 
'C:\Jenkins\Automation\Blah\Foo\Bar\646433\Schema\test\473289_12321.ps1',
'C:\Jenkins\Automation\Blah\Foo\Bar\2112\Schema\QA\473289_123211.ps1'

$text | foreach {'C:\Question\{0}' -f $_.split('\',8)[-1]}
C:\Question\Schema\test\473289_12321.ps1
C:\Question\Schema\QA\473289_123211.ps1

【讨论】:

  • 这比正则表达式执行得更快吗?
  • 尚未对其进行基准测试,但我希望它会。通常字符串方法操作比 PS 操作符快,在这些操作符中,正则表达式操作(-match、-replace、-split)往往是最慢的。
  • 谢谢。我有一个问题,第 1 行是 PRINT c:\blah\blah\blah 等。我的进程在一行中找到 7 个反斜杠后立即删除所有内容。仅当行以 :R 开头或不以 PRINT 开头并且匹配 7 个反斜杠时,我可以让它进行替换吗?
  • 这超出了原始问题的范围。我会为此发布一个新问题。
【解决方案2】:

这个([^\\]*\\){7} 正则表达式查找以反斜杠结尾的捕获组 7 次并将其替换。

已更新.:\\([^\\]*\\){6} 正则表达式会根据您的评论查找看起来像从任何根驱动器 .:\ 开始的路径后跟 6 次以反斜杠结尾的捕获组的字符串

$text = @"
C:\Jenkins\Automation\Blah\Foo\Bar\646433\Schema\test\473289_12321.ps1
C:\Jenkins\Automation\Blah\Foo\Bar\2112\Schema\QA\473289_123211.ps1
PRINT C:\Jenkins\Automation\Blah\Foo\Baz\2112\Schema\QA\473289_123212.ps1
C:\Jenkins\Automation\Blah\Foo\quux\2112\Schema\QA\473289_123213.ps1
"@
#depending on how you get the text (single string or array)
#$text.Split("`n") | % { $_ -Replace '.:\\([^\\]*\\){6}','C:\Example\' }
$text -Replace ".:\\([^\\`n]*\\){6}","C:\Example\"

结果:

C:\Example\Schema\test\473289_12321.ps1
C:\Example\Schema\QA\473289_123211.ps1
PRINT C:\Example\Schema\QA\473289_123212.ps1
C:\Example\Schema\QA\473289_123213.ps1

【讨论】:

  • 如果您使用Get-Content,您可能不需要在换行符和For-EachObject (%) 脚本块上拆分并直接应用正则表达式替换。
  • 我在捕获组中排除了换行符,因此不再需要 %
  • 谢谢。我有一个问题,第 1 行是 PRINT c:\blah\blah\blah 等。我的进程在一行中找到 7 个反斜杠后立即删除所有内容。仅当行以 :R 开头或不以 PRINT 开头并且匹配 7 个反斜杠时,我可以让它进行替换吗?
  • 易于将正则表达式从([^\`n]*\\){7} 更改为.:\\([^\`n]*\\){7},这也是为什么最好使用清晰且易于维护的正则表达式的原因之一。即使你可能会牺牲一点点性能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多