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

powershell - remove string containing line breaks and spaces

我在 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

这很好用。但是,我有一个烦人的字符串,我无法摆脱它。

它基本上包括:一个换行符和回车符return,4个空格,然后是一个换行符和回车符return。在十六进制中它是 0D 0A 20 20 20 20 0D 0A

如何删除它?

我简单试了一下:

Where-Object {$_ -notmatch '    '} #4 x spaces

但是删除了该行之后的所有内容(这是在第二行)。

我看过:

Where-Object {$_ -notmatch '$([char]0x0D)'}

(如果它删除了我在另一个 post 某处看到的所有马车 Returns,我会扩展它,但那没有任何作用。

处理这个问题的正确方法是什么?


补充: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行

试试 .Net String class:

Where-Object {-not[string]::IsNullOrEmpty(([string]$_).trim())}

Trim 将删除空格,IsNullOrEmpty 将检查其余部分。

这里有两点值得指出。当您使用 -match/-notmatch 时,您使用的是正则表达式。我们可以将您的字符串和 space 问题合并为一个字符串。

Get-Content $Local_Dir1$filename1 | 
    Where-Object {$_ -notmatch 'stringToMatch|secondStringToMatch|\s{4,}'} | 
    Set-Content $Local_Dir1$filename

这可以使用交替来匹配由竖线分隔的任一元素。这绝不是完美的,因为我们没有可用的示例数据,但如果您有包含这两个字符串中的任何一个或至少 4 个连续的 space 的行,它们将被忽略。

通过在评论中讨论和查看示例文件,您只是在尝试省略空白行。使用另一个字符串 class 或正则表达式可以解决这个问题。这些行的功能不同,但都会忽略只是白色的行-space.

  • ![string]::IsNullOrWhiteSpace($_)
  • -notmatch ^\s+$

我会选择前者,因为它更直观。

Where-Object {![string]::IsNullOrWhiteSpace($_) -and $_ -notmatch 'stringToMatch|secondStringToMatch'}

就像我在评论中所说的那样,如果你对这个要求很挑剔,你可以过滤掉恰好有 4 个白色-space 字符和 -notmatch ^\s{4}$

的行

也像 sodawillow 说你应该使用双引号来允许变量扩展。由于您使用的是正则表达式 \r 也可以正常工作。

Where-Object {$_ -notmatch "$([char]0x0D)"}

但是我不认为你无论如何都会看到那个字符以便排除它。 Get-Content 会将其擦除以制作字符串数组。这可能取决于编码。