从以下文本文件中删除包含 pizza 一词的行:
The cat is my favorite animal. I prefer pizza to vegetables. My favorite color is blue. Tennis is the only sport I like. My favorite leisure time activity is reading books.
我运行了以下代码并成功删除了第二行。
http_build_query
但是,我还没有找到一种方法来删除包含单词 pizza 或单词 sport 的所有行。我已尝试使用此代码执行此操作:
$inputFile = "C:\Temp\Text.txt"
Get-Content $inputFile | Where-Object {$_ -notmatch 'pizza'} | Set-Content "C:\Temp\Filtered.txt"
但它不起作用,因为输出文件与原始文件相同。
答案 0 :(得分:3)
我发现Where-Object {$_ -notmatch 'this|that'}
是一种更好的匹配多个条件的方法,因为管道就像-Or
一样。
$inputFile = "C:\Temp\Text.txt"
Get-Content $inputFile | Where-Object {$_ -notmatch 'pizza|sport'} | Set-Content "C:\Temp\Filtered.txt"
答案 1 :(得分:0)
您需要明确逻辑。
首先,使用积极条件 获取我的文本文件中包含这个词的所有行' pizza' 或这个词' sport':
Get-Content $inputFile | Where-Object {$_ -match 'pizza' -or $_ -match 'sport'}
输出应为
I prefer pizza to vegetables.
Tennis is the only sport I like.
然后,否定条件以获得所需结果:
Get-Content $inputFile | Where-Object { -NOT ($_ -match 'pizza' -or $_ -match 'sport') }
De Morgan's laws允许将否定条件重写为
Get-Content $inputFile | Where-Object { $_ -NOTmatch 'pizza' -AND $_ -NOTmatch 'sport' }
以下脚本在PowerShell中实现了 De Morgan的法律的truth table(天真)实现
''
'{0,-6} {1,-6}: {2,-7} {3,-7} {4,-7} {5,-7}' -f 'P', 'Q', 'DM1a', 'DM1b', 'DM2a', 'DM2b'
''
ForEach ( $P in $True, $False ) {
ForEach ( $Q in $True, $False ) {
'{0,-6} {1,-6}: {2,-7} {3,-7} {4,-7} {5,-7}' -f $P, $Q,
( -not ( $P -and $Q ) -eq ( ( ( -not $P ) -or ( -not $Q ) ) ) ),
( ( $P -and $Q ) -eq ( -not ( ( -not $P ) -or ( -not $Q ) ) ) ),
( -not ( $P -or $Q ) -eq ( ( ( -not $P ) -and ( -not $Q ) ) ) ),
( ( $P -or $Q ) -eq ( -not ( ( -not $P ) -and ( -not $Q ) ) ) )
}
}
输出(请注意DM2a
列涵盖您的案例):
PS D:\PShell> D:\PShell\tests\DeMorgan.ps1
P Q : DM1a DM1b DM2a DM2b
True True : True True True True
True False : True True True True
False True : True True True True
False False : True True True True