Ïîêàçàòü ïîëíóþ ãðàôè÷åñêóþ âåðñèþ : [ðåøåíî] Ðåäàêòèðîâàíèå ôàéëà ñ ñèìâîëàìè
Åñòü ðåäàêòèðóåìûé ôàéë, âíóòðè íåãî ïîäîáíîå:
»˜¢8bgatvvwfbcmk4joye403s2970Ií²åˆ ¸2ßú¶ötÌ“Ö!9ÿ1<?xml version='1.0' encoding='utf-8'?><products><product>
ß ðàáîòàþ ñ ÷èòàåìûì òåêñòîì, íî â íåì åñòü òàêæå íå÷èòàåìûå ñèìâîëû/èåðîãëèôû.
Åñëè ïîïûòàòüñÿ ñäåëàòü ïðîñòåéøóþ çàìåíó â ýòîì ôàéëå, íàïðèìåð:
$FILE = Get-Content test.bnk
$NEWFILE = $FILE -replace "123", ""
$NEWFILE | Set-Content test.bnk
Çàìåíà ïðîéäåò óñïåøíî, íî òå ñèìâîëû è èåðîãëèôû áóäóò ïåðåïèñàíû íåâåðíî, à ýòî äëÿ èñïîëíÿåìîé ïðîãðàììû êðèòè÷íî, îòñþäà è âîïðîñ êàê ðåäàêòèðîâàòü ôàéë íå çàòðàãèâàÿ ýòè ñèìâîëû ?
Ïðîáîâàë ìåíÿòü êîäèðîâêè íà âõîäå è íà âûõîäå, íå ïîìîãëî.
Òàêæå ïðîáîâàë èñïîëüçîâàòü ìåòîä System.IO.Stream è òàì ñèòóàöèÿ òî÷íî òàêàÿ æå.
Serguei Kouzmine
29-04-2022, 04:20
ðàññêàæèòå ïîïîäðîáíåå ïðî ýòó âàøó ïðîñòåéøóþ çàìåíó
ryok, äàéòå îáðàçåö ôàéëà.
ðàññêàæèòå ïîïîäðîáíåå ïðî ýòó âàøó ïðîñòåéøóþ çàìåíó »
Çàìåíà âûøå ýòî ïðîñòî ïðèìåð, âàæíî ÷òî ïðîèñõîäèò ïîñëå ýòîãî, ÿ òàê ïîíèìàþ PowerShell ïåðåïèñûâàåò âåñü ôàéë ïîëíîñòüþ, à íå òî÷å÷íî êàê ìîæåò ïîêàçàòüñÿ, ïî âñåé âèäèìîñòè îòñþäà è ïðîáëåìà èäåò, ñèìâîëû è èåðîãëèôû îí íå ìîæåò ïåðåçàïèñàòü â òîì ñîñòîÿíèè â êîòîðîì îíè íàõîäèëèñü èçíà÷àëüíî.
Ìíå æå íóæíî ñäåëàòü òî÷åíûå èçìåíåíèÿ â ôàéëå, áåç ïåðåçàïèñè âñåãî ôàéëà öåëèêîì.
äàéòå îáðàçåö ôàéëà. »
Ê ñîæàëåíèþ, ÿ íå ìîãó ýòî ñäåëàòü, â ôàéëå ìíîãî êîíôèäåíöèàëüíûõ äàííûõ, ÷òî-òî êîíêðåòíîå õîòèòå ñäåëàòü ñ ôàéëîì ?
÷òî-òî òèïà ýòîãî (https://stackoverflow.com/a/32759743/3491376) íàâåðíîå. Ñòðîêà íå îäíîáàéòíàÿ â .net.
â ôàéëå ìíîãî êîíôèäåíöèàëüíûõ äàííûõ »
Óáåðèòå èõ/çàìåíèòå íà "¸ëî÷êà", "ðîìàøêà", èëè îñòàâüòå òîëüêî ïåðâûå ïàðó ñòðîê â êîòîðûõ ïðîèñõîäèò óêàçàííàÿ ïðîáëåìà.
Sham,
Êîä èíòåðåñíûé, áóäó â íåì ðàçáèðàòüñÿ, ñïàñèáî.
Fors1k,
òåñòîâûé ôàéë ïðèêðåïèë, âîò õî÷ó â íåì ñäåëàòü çàìåíó :
$FILE = Get-Content C:\Users\Ps-2\Desktop\123\test.bnk
$NEWFILE = $FILE -replace '<app-developer>0<\/app-developer>', '<app-developer>2</app-developer>'
$NEWFILE | Set-Content C:\Users\Ps-2\Desktop\123\test.bnk
Îòðàáàòûâàåò íîðìàëüíî, íî ïðîãðàììà óæå îòêàçûâàåòñÿ ðàáîòàòü ñ òàêèì ôàéëîì, à åñëè ÿ ñàì çàéäó â ôàéë ÷åðåç Notepad++ è ïîìåíÿþ ýòó ñòðîêó <app-developer>0</app-developer> íà ýòó <app-developer>2</app-developer> òî âñå îê.
Êàê ÿ ïîíèìàþ, êîäèðîâêà èñõîäíîãî ôàéëà - ANSI.
Ïîïðîáóåì óêàçàòü å¸ ñòðîãî âðó÷íóþ.
cls
$pathIn = "C:\Users\Ps-2\Desktop\123\test.bnk"
$pathOut = "C:\Users\Ps-2\Desktop\123\test_new.bnk"
$ANSI = [Text.Encoding]::GetEncoding(1251)
$old = [IO.File]::ReadAllText($pathIn, $ANSI)
$new = $old.Replace('<app-developer>0', '<app-developer>2')
[IO.File]::WriteAllText($pathOut, $new, $ANSI)
# Ïðîâåðêà
Start notepad $pathOut
$oldFile = Get-Content $pathIn -TotalCount 1 -Delimiter "<?xml"
$newFile = Get-Content $pathOut -TotalCount 1 -Delimiter "<?xml"
Write-Host "Äî : $oldFile"
Write-Host "Ïîñëå: $newFile"
Write-Host -NoNewline "Ñèìâîëû â íà÷àëå ôàéëà èäåíòè÷íû? "
$oldFile -eq $newFile
 èòîãå ïîñëå çàìåíû â ôàéëå, êîòîðûé âû ïðåäîñòàâèëè, îøèáîê â íà÷àëüíûõ ñèìâîëàõ íåò. Ðåçóëüòàò â êîíñîëè:
Äî : Ìͺ8p7iy6w38emu91ikg56wrvb5axIº ‹ ¶`òÓëKÒÐ8Ï—;Ñ´¢9½1<?xml
Ïîñëå: Ìͺ8p7iy6w38emu91ikg56wrvb5axIº ‹ ¶`òÓëKÒÐ8Ï—;Ñ´¢9½1<?xml
Ñèìâîëû â íà÷àëå ôàéëà èäåíòè÷íû? True
get-content -raw / set-content -nonewline òîæå ìîãóò ðàáîòàòü. Íî áèíàðíûå äàííûå ýòî ìàññèâ áàéòîâ, à íå òåêñò.
Íî áèíàðíûå äàííûå ýòî ìàññèâ áàéòîâ, à íå òåêñò. »
À ãäå çäåñü áèíàðíûå äàííûå åñòü?
òå áàéòû/îêòåòû, êîòîðûå ïî ôîðìàòó ôàéëà íå äîëæíû èíòåðïðåòèðîâàòüñÿ êàê êîäû ñèìâîëîâ êîäèðîâêè. Åñëè âñå áàéòû ïðèíóäèòåëüíî ÷èòàòü êàê òåêñò, òî ìîãóò áûòü ïðîáëåìû, îñîáåííî ñ êîäàìè óïðàâëÿþùèõ ñèìâîëîâ 00-1f è äð. (îíè íå òåêñòîâûå ñèìâîëû â 1-áàéòíîé êîäèðîâêå òèïà 1251).
Ñòðîêà ìîæåò õðàíèòü â ñåáå è óïðàâëÿþùèå ñèìâîëû, ê ïðèìåðó òîò æå äåñÿòûé è ïðî÷èå áàéòû óïðàâëÿþùèõ ñèìâîëîâ, íàëè÷èå êîòîðûõ ìû ìîæåì âèäåòü â ñòðîêå.
Óêàçàííóþ ïðîáëåìó ñ ñèìâîëàìè 00-1f âîñïðîèçâåñòè íå óäàåòñÿ:
cls
[Byte[]]$bytesSrc = 0x00..0x0F+65+0x10..0x1F
$text = [Text.Encoding]::UTF8.GetString($bytesSrc)
$text = $text.Replace("A", "B")
$bytesNew = [Text.Encoding]::UTF8.GetBytes($text)
Compare-Object $bytesSrc $bytesNew
Ìîæåòå ïðèâåñòè ïðèìåð?
Fors1k,
Âàø âàðèàíò ñðàáîòàë, áëàãîäàðþ, ñòðàííî ÷òî ÿ òîæå ïðîáîâàë ðàçíûå êîäèðîâêè, íî íå çíàë ÷òî ANSI èìåííî òàê îáîçíà÷àåòñÿ, ÿ ïî÷åìó-òî ïðîáîâàë òàê [System.Text.Encoding]::ASCII :laugh:
Êñòàòè ïîïóòíî åùå îäèí âîïðîñ ïîÿâèëñÿ, â íà÷àëå 6 ñòðîêè òåñòîâîãî ôàéëà åñòü âîò òàêîå:
app-developer 0x
ìíå íóæíî çàìåíèòü òàì ãäå 0x íà 2õ, íî îí ðàñïîëîæåí ïðÿì â ýòèõ ñèìâîëàõ, êàê ýòî ïî ðåãóëÿðêå ìîæíî íàéòè è çàìåíèòü îïÿòü æå íå ïîâðåäèâ ýòè ñèìâîëû âîêðóã ?
Çàìåíèòü â îáîèõ ìåñòàõ:
cls
$pathIn = "C:\Users\Ps-2\Desktop\123\test.bnk"
$pathOut = "C:\Users\Ps-2\Desktop\123\test_new.bnk"
$ANSI = [Text.Encoding]::GetEncoding(1251)
$old = [IO.File]::ReadAllText($pathIn, $ANSI)
$new = $old -replace "(?<=app-developer.+?)0", '2'
[IO.File]::WriteAllText($pathOut, $new, $ANSI)
Get-Content áåç -raw îòäà¸ò ìàññèâ ñòðîê, êîòîðûé ïðè êîýðñèè â ñòðîêó ïðîñòî êîíêàòåíèðóåòñÿ áåç çíàêîâ ïåðåíîñà. Èç-çà ýòîãî ó ÒÑ íåêîððåêòíî ïèñàëñÿ ôàéë ñ ïîòåðåé ñèìâîëîâ ïåðåíîñà ñòðîêè.
Ïðîáëåì ïðè èíòåðïðåòàöèè áèíàðíûõ äàííûõ îäíîáàéòîâîé òåêñòîâîé êîäèðîâêîé âîçíèêàòü íå äîëæíî. Âîò ïðè ìíîãîáàéòîâûõ þíèêîäàõ ìîãóò áûòü íåêîððåêòíûå ïîñëåäîâàòåëüíîñòè áàéòîâ. Âîò òàêèå ñëó÷àè âñå ïðîòåñòèðîâàòü ìîæíî, êîíå÷íî, ïðè áîëüøîì æåëàíèè. Ãëþê ìîæåò âûëåçòè â ëþáîé ìîìåíò.
Fors1k,
òàê êàê çàìåíà ïðîèñõîäèëà åùå è â äðóãèõ ìåñòàõ, è ïîðòèëà ôàéë, íåìíîãî ïîäïðàâèë ðåãóëÿðíîå âûðàæåíèå íà ýòî
(?<=app-developer..|app-developer>)0
åùå ðàç ñïàñèáî âàì çà ïîìîùü.
Sham,
íàñ÷åò -raw ñåé÷àñ ïðîâåðèòü íå ìîãó, ÿ åãî êàê òî â îäíîì èç òåñòîâ òîæå èñïîëüçîâàë è îí ìíå íå ïîìîã.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.