powershell - 删除包含换行符和空格的字符串

时间:2015-11-24 11:53:25

标签: string powershell replace powershell-v2.0

我有一个在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行。

2 个答案:

答案 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}$

过滤出恰好有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将检查其余内容。