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
会将其擦除以制作字符串数组。这可能取决于编码。
我在 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
会将其擦除以制作字符串数组。这可能取决于编码。