Удалить NUL-символ в файле с помощью powershell - PullRequest
2 голосов
/ 21 марта 2020

Я новичок ie в powershell, я пытаюсь удалить NUL-символ в файле. Ниже приведен снимок файла

Исходный файл snaphsot

Original file snaphsot

Я пытался использовать приведенный ниже код для удаления символа NUL в строке 2

$filepath=<File name>
[STRING]$test = [io.file]::ReadAllText($filepath)
$test = $test -replace "\x00","`n"
$test = $test -replace "`n"," " 
echo $test
$test | out-file ./testoutput.txt

но код превратил всю запись в одну запись.

Я также попробовал нижеприведенный код

$filepath=<filename>
$tempath=<temp file name>
Move-Item -Path $filepath -Destination $temppath
ForEach ($file in (Get-Content $temppath)) {
[STRING]$test = $file
$test = $test -replace "`0",""
$test = $test -replace "`r`n","" 
echo $test
$test | out-file $filepath -Append
}

, который удалял NUL-символ, однако второй ряд, который выглядел как несколько строк

Преобразованное изображение файла

Converted file image

Мое требование состоит в том, чтобы удалить символ NUL и сделать вторую строку одной строкой вместо нескольких строк. Оцените любую помощь на этом

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Трудно сказать, чего вы пытаетесь достичь sh. Похоже, что в вашем файле есть символы NUL.

Если вы хотите удалить все символы NUL, вы можете сделать следующее:

(Get-Content $filepath) -replace '\0' | Set-Content $temppath

Если вы хотите удалить строки, содержащие только NULCRLF, вы можете сделать следующее:

(Get-Content $filepath) -notmatch '^\0$' | Set-Content $temppath

Если вы хотите удалить все NUL-символы и строки, содержащие только CRLF или NULCRLF, вы можете сделать следующее:

(Get-Content $filepath) -replace '\0' -ne '' | Set-Content $temppath

Если вы хотите удалить все NUL-символы и соединить строки, которые не заканчивая |, вы можете сделать следующее:

$output = [System.Text.StringBuilder]::new()
(Get-Content $filepath) -replace "\0" | Foreach-Object {
    if ($_ -match '\|$') {
        [void]$output.AppendLine($_)
    } else {
        [void]$output.Append($_)
    }
}
$output.ToString() -replace '\r\n$' | Set-Content $temppath
0 голосов
/ 21 марта 2020

Это работает для меня. Прямо перед b (62) есть ноль. 0d 0a - возврат каретки, перевод строки или "` r`n ". Windows будет отображать нули в виде пробелов.

echo a "`0b" c | set-content file
format-hex file


           Path: C:\Users\js\foo\file

           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   61 0D 0A 00 62 0D 0A 63 0D 0A                    a...b..c..


(get-content file) -replace "`0" | set-content file2
format-hex file2


           Path: C:\Users\js\foo\file2

           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   61 0D 0A 62 0D 0A 63 0D 0A                       a..b..c..

...