我有一个在powershell(v2)中运行的脚本,它从文件中删除字符串。
基本过程是:
(Get-Content $Local_Dir1\$filename1) -replace 'longString', 'shortString' | `
Set-Content $cfg_Local_Dir\$filename1
Get-Content $Local_Dir1\$filename1 | `
Where-Object {$_ -notmatch 'stringToMatch'} | `
Where-Object {$_ -notmatch 'secondStringToMatch'} | `
Set-Content $Local_Dir1\$filename
这很好用。但是,我有一个令人讨厌的字符串,我无法摆脱它。
它基本上包括:换行符和回车符,4个空格,然后是换行符和回车符。在HEX中,它是0D 0A 20 20 20 20 0D 0A
如何删除此内容?
我试过简单:
Where-Object {$_ -notmatch ' '} #4 x spaces
但是删除了该行之后的所有内容(这是在第二行)。
我看了看:
Where-Object {$_ -notmatch '$([char]0x0D)'}
(如果它删除了所有的回车,我会扩展它),我在另一篇文章中看到了,但是没有做任何事情。
处理这个问题的正确方法是什么?
附加:2015-11-24 13:49
示例数据:
<?xml version="1.0" encoding="UTF-8"?>
<start_of_data>
<job>123456</job>
<name>ABC123</name>
<start></start>
</start_of_data>
<start_of_data>
<job>789012</job>
<name>DEF345</name>
<start></start>
</start_of_data>
最初第2行有一个字符串,由'stringToMatch'删除,空格在第3行。
答案 0 :(得分:3)
有些事情值得指出。当您使用-match
/ -notmatch
时,您正在使用正则表达式。我们可以将您的字符串和空间问题合并为一个字符串。
Get-Content $Local_Dir1\$filename1 |
Where-Object {$_ -notmatch 'stringToMatch|secondStringToMatch|\s{4,}'} |
Set-Content $Local_Dir1\$filename
使用交替来匹配由管道分隔的任何元素。这绝不是完美的,因为我们没有要使用的样本数据,但如果你有两个字符串或至少4个连续空格中的任何一行,它们将被省略。
从评论中查看并查看示例文件,您只是想省略空白行。使用另一个字符串类或正则表达式可以解决这个问题。这些行的功能不同,但都会忽略只是空白行的行。
![string]::IsNullOrWhiteSpace($_)
-notmatch ^\s+$
我会选择前者,因为它更直观。
Where-Object {![string]::IsNullOrWhiteSpace($_) -and $_ -notmatch 'stringToMatch|secondStringToMatch'}
就像我在评论中所说的那样,如果你对此要求很挑剔,你可以使用-notmatch ^\s{4}$
同样sodawillow表示你应该使用双引号来允许变量扩展。由于您正在使用正则表达式\r
,因此也可以正常工作。
Where-Object {$_ -notmatch "$([char]0x0D)"}
但是我不会认为你会看到那个角色,无论如何要排除它。 Get-Content
会将其清除以制作字符串数组。这可能取决于编码。
答案 1 :(得分:2)
尝试.Net 字符串类:
name idletime
RJ14 400
RJ14 50
VJ23 200
VJ23 30
Where-Object {-not[string]::IsNullOrEmpty(([string]$_).trim())}
将删除空格,Trim
将检查其余内容。