给出两个单词/模式:P1和P2。如何实现一个Add-Type -AssemblyName Microsoft.VisualBasic
$datatable = New-Object System.Data.DataTable
$src = "D:\Downloads\test.txt"
$reader = New-Object -TypeName Microsoft.VisualBasic.FileIO.TextFieldParser -ArgumentList $src
$reader.Delimiters = @(",")
#Default values, but wanted to show the options
$reader.HasFieldsEnclosedInQuotes = $true
$reader.TrimWhiteSpace = $true
#Get header as array
$columns = $reader.ReadFields()
foreach ($column in $columns) {
$datatable.columns.add($column)
}
while($fields = $reader.ReadFields()) {
$row = $datatable.NewRow()
#Insert value in property using field(column) index
for ($i = 0; $i -lt $columns.Count; $i++) {
$row.($columns[$i]) = $fields[$i]
}
$datatable.Rows.Add($row)
}
$reader.Close()
的管道过滤器,用于抑制以P1结尾的每个行,除了包含P2的那些?
编辑:示例,其中P1为"确定。"和P2是"重新定义" :
应该通过
grep
应该被压制
X X not found.
: X ; Redefine X. ok.
ok. is not at end of line
?
答案 0 :(得分:2)
如果Awk解决方案可以接受,那就很简单了。
awk '/P2/ || !/P1$/' file
使用grep -P
,您可以说
grep -P 'P2|(?!P1$).{0,2}$' file
但这很难理解而且不便携。还要注意,最后一个量词需要更新以匹配P1的长度(如果行太短而不能完全包含它,它应该允许短于P1的字符串。)
答案 1 :(得分:0)
答案 2 :(得分:0)
由于“抑制P1 $除非包含P2”就像“允许P1后跟某个东西或P2后跟任何后跟P1的东西”:
$ (echo "asdfP2lkj P1" ; echo "asdfP3lkj P1" ; echo "P1 z") | \
grep -P 'P1.+|P2.*P1$'
asdfP2lkj P1
P1 z