在 Powershell 中使用 Select-Object,我如何才能 select 每行只显示我想要的字符串部分?
Using Select-Object in Powershell, how can I select only the part of a string I want on a per line basis?
目前我有一个脚本可以搜索一个目录并查找所有“dummy”一词的实例。然后它将文件名、路径、行号、行输出到 CSV 文件。
此行包含非常标准化的结果,例如:
- 嗨,我是假人,你是谁?
- 什么东西是假的,等等等等?
- 最后是哑巴,今天过得怎么样?
我正在尝试寻找一种方法来在我的 CSV 中输出一个附加列,该列包含“?”之前的所有字符。以及“dummy”之后的所有字符。
结果行将是:
- 你是谁
- 等等等等
- 今天过得怎么样
我尝试使用拆分,但它一直在删除其他字符。是否可以找到“dummy”和“?”的索引?然后把中间部分子串出来?
如有任何帮助,我们将不胜感激。
目前的代码:
Write-Host "Hello, World!"
# path
$path = 'C:\Users\Documents_Testing\fe\*.ts'
# pattern to find dummy
$pattern = "dummy,"
Get-ChildItem -Recurse -Path $path | Select-String -Pattern $pattern |
Select-Object FileName,Path,LineNumber,Line
,@{name='Function';expression={
$_.Line.Split("dummy,")
}} |
Export-Csv 'C:\Users\User\Documents_Testing\Output1.csv' -NoTypeInformation
Write-Host "Complete"
使用 -replace
regex 运算符将整行替换为 dummy,
和 ?
之间的部分:
PS ~> 'Hi I am a dummy, who are you?' -replace '^.*dummy,\s*(.*)\?\s*$', ''
who are you
所以您计算出的 属性 定义应该是这样的:
@{Name = 'Function'; Expression = { $_.Line -replace '^.*dummy,\s*(.*)\?\s*$', '' }}
上面使用的模式说明:
^ # start of string
.* # 0 or more of any character
dummy, # the literal substring `dummy,`
\s* # 0 or more whitespace characters
( # start of capture group
.* # 0 or more of any character
) # end capture group
\? # a literal question mark
\s* # 0 or more whitespace characters
$ # end of line/string
如果您还想删除第一个 ?
之后的所有内容,请稍微更改模式:
@{Name = 'Function'; Expression = { $_.Line -replace '^.*dummy,\s*(.*?)\?.*$', '' }}
将元字符 ?
添加到 .*
使子表达式 惰性 ,这意味着正则表达式引擎尝试匹配 尽可能少的字符 尽可能 - 这意味着我们只会捕获到 first ?
.
目前我有一个脚本可以搜索一个目录并查找所有“dummy”一词的实例。然后它将文件名、路径、行号、行输出到 CSV 文件。
此行包含非常标准化的结果,例如:
- 嗨,我是假人,你是谁?
- 什么东西是假的,等等等等?
- 最后是哑巴,今天过得怎么样?
我正在尝试寻找一种方法来在我的 CSV 中输出一个附加列,该列包含“?”之前的所有字符。以及“dummy”之后的所有字符。
结果行将是:
- 你是谁
- 等等等等
- 今天过得怎么样
我尝试使用拆分,但它一直在删除其他字符。是否可以找到“dummy”和“?”的索引?然后把中间部分子串出来?
如有任何帮助,我们将不胜感激。
目前的代码:
Write-Host "Hello, World!"
# path
$path = 'C:\Users\Documents_Testing\fe\*.ts'
# pattern to find dummy
$pattern = "dummy,"
Get-ChildItem -Recurse -Path $path | Select-String -Pattern $pattern |
Select-Object FileName,Path,LineNumber,Line
,@{name='Function';expression={
$_.Line.Split("dummy,")
}} |
Export-Csv 'C:\Users\User\Documents_Testing\Output1.csv' -NoTypeInformation
Write-Host "Complete"
使用 -replace
regex 运算符将整行替换为 dummy,
和 ?
之间的部分:
PS ~> 'Hi I am a dummy, who are you?' -replace '^.*dummy,\s*(.*)\?\s*$', ''
who are you
所以您计算出的 属性 定义应该是这样的:
@{Name = 'Function'; Expression = { $_.Line -replace '^.*dummy,\s*(.*)\?\s*$', '' }}
上面使用的模式说明:
^ # start of string
.* # 0 or more of any character
dummy, # the literal substring `dummy,`
\s* # 0 or more whitespace characters
( # start of capture group
.* # 0 or more of any character
) # end capture group
\? # a literal question mark
\s* # 0 or more whitespace characters
$ # end of line/string
如果您还想删除第一个 ?
之后的所有内容,请稍微更改模式:
@{Name = 'Function'; Expression = { $_.Line -replace '^.*dummy,\s*(.*?)\?.*$', '' }}
将元字符 ?
添加到 .*
使子表达式 惰性 ,这意味着正则表达式引擎尝试匹配 尽可能少的字符 尽可能 - 这意味着我们只会捕获到 first ?
.