Autor Wątek: Windows CMD - jak rozpoznać i zamienić [CR][LF]  (Przeczytany 8392 razy)

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Windows CMD - jak rozpoznać i zamienić [CR][LF]
« dnia: 2018.02.24, 01:53:07 »

Przerobiłem tymczasowo AYSplitter, żeby zamiast nowej linii wstawiał tekst _CRLF_
Tworzy on teraz plik .ini, w którym poszczególne linie są oddzielone tym właśnie _CRLF_
Dzięki temu cały plik .ini daje się pobrać jako zmienna o nazwie inicontent.

Teraz szukam rozwiązania, jak w tym pliku .ini z powrotem zamienić string _CRLF_ na właściwy znak nowej linii.
Próbowałem już wielu rozwiązań, np.:
zamienić w zmiennej inicontent=%inicontent:_CRLF_="\r\n"% - nie działa
zamienić _CRLF_ na kody ^x0D^x0A - nie działa
zamienić w ten sam sposób bezpośrednio w pliku - nie działa
utworzyć inną zmienną z pliku tekstowego zawierającego dwa znaki [CR][LF] i wstawiać je do zmiennej lub nowego pliku na bazie poprzedniego - też nie działa.
Nie mam już więcej pomysłów. Męczę się już z tym trzeci tydzień.

Jeśli nie da się zrobić tego w Command line, to pomógłby ktoś z gotowym rozwiązaniem w C#, Pascal, czymkolwiek.
Wywołany plik .exe zrobiłby swoje, tzn zamienił w pliku tymczasowe _CRLF_ na nową linię.
AY Music, ULA plus.

KWF

  • *****
  • Wiadomości: 6823
  • Miejsce pobytu:
    trzecia planeta od Słońca
  • "I co ja robię tu, u-u, co Ty tutaj robisz ..."
    • Insta do lasownia
Odp: Windows CMD - jak rozpoznać i zamienić [CR][LF]
« Odpowiedź #1 dnia: 2018.02.24, 08:14:05 »
Jeżeli masz Windowsa z PowerShellem:
https://blogs.technet.microsoft.com/heyscriptingguy/2008/01/17/hey-scripting-guy-how-can-i-use-windows-powershell-to-replace-characters-in-a-text-file/

Albo "old school method" w batchu:
setlocal enabledelayedexpansion
set data=%1
set search=%2
set replace=%3
set "data=!data:%search%=%replace%!"
echo %data%
REM Use %data% here before calling endlocal.
endlocal

Albo coś w ten deseń. Nie tworzylem batchow od 15 lat.
KWF
-----
R Tape loading error 0:1
Moje zabawki: https://github.com/McKlaud76

gregoryi

  • ****
  • Wiadomości: 288
  • Miejsce pobytu:
    Opole
Odp: Windows CMD - jak rozpoznać i zamienić [CR][LF]
« Odpowiedź #2 dnia: 2018.02.24, 15:04:16 »
W commandline
if {zminenna} EQU {_CRLF_} echo. >> plik wynikowy

echo. - nowa linia w pliku

Daj plik ja pobawię się.
Na bieżąco jestem z cmd.
ZX Spectrum 16, ZX Spectrum 48, ZX Spectrum 128 +2 Grey, ZX Spectrum 128 +3, Amstrad 6128, Commodore 64C, Amiga 600, Klony - Harlequin 48 Rev G, Harlequin 128 Rev 2D, Just Speecy 128, ZX Nuvo 128

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Windows CMD - jak rozpoznać i zamienić [CR][LF]
« Odpowiedź #3 dnia: 2018.02.25, 03:18:44 »
@Klaud - tutaj właśnie jest problem, znane mi metody zamiany wywalają się na znaku nowej linii :(

@gregoryi - dzięki za podpowiedź echo. (z kropką). Nie znałem tego. :)

Skrypt ma utworzyć nowy plik _maker.ini na bazie tamtego, zamieniając znaki. Dlaczego tak?
Prosto było przerobić AY Splitter w Delphi, żeby zamiast nowej linii wstawiał tymczasowy separator _CRLF_
Na zmodyfikowanie AY Maker przyjdzie czas, na razie sobię z nim nie radzę.
To jest tymczasowe rozwiązanie, chcę sprawdzić jak będzie działała całość.
Na razie ograniczam się do rozebrania i złożenia pojedynczego pliku .ay, pętle i powtórzenia dla wielu dorobię.

Tu jest trochę mieszania między folderami, oryginalny plik .ay zostaje w tym samym folderze, co plik .bat
Robocze pliki są przenoszone do folderu \temp
Tam też znajduje się plik crlf.txt zawierający wlaściwe znaki nowej linii.
Plik aysplit.exe jest w folderze \bin... mniejsza z tym, to chodzi dobrze.

Problem zaczyna się od miejsca REM ----------------- HERE IS THE BUG -----------------------
Poprawnie wczytywane są kody CRLF do zmiennej,
ale utworzony nowy plik _maker.ini zawiera tylko kody CRLF bez danych.

Nie wiem też, jak pobrać nazwę oryginalnego pliku .ay, która może być dowolna, do zmiennej. Przyda się na etapie edycji.


Załączam .zip, który zawiera wszystko do przetestowania _split.bat z przykładami.
AY Music, ULA plus.

smok.wawelski

  • ***
  • Wiadomości: 225
  • Miejsce pobytu:
    Warszawa
Odp: Windows CMD - jak rozpoznać i zamienić [CR][LF]
« Odpowiedź #4 dnia: 2018.02.25, 16:13:59 »
Notepad++ to potrafi.
W każdym języku programowania jest to banalne.
Jest na pewno mnóstwo programików commandline'owych które to potrafią (sed, awk, itp. także w wersjach pod Windows)

Polecam UnixTools do takich zabaw z tekstem:
http://unxutils.sourceforge.net/

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Windows CMD - jak rozpoznać i zamienić [CR][LF]
« Odpowiedź #5 dnia: 2018.02.25, 21:24:22 »
Zależy mi, żeby program (batch) działał w na każdym Windows, powiedzmy od Win 7. Bez instalowania dodatkowych komponentów, nawet bez Power shell.

Ale nie ma żadnych przeciwwskazań, co do wywoływania zewnętrznych .exe, napisanych w C# lub innym języku, nawet zawierających jedną instrukcję. 
Zacząłem od command line, dlatego że składnia jest dość prosta i rezultat można spawdzić natychmiast. Gdy program będzie chodził bezbłędnie, będę mógł spróbować przepisać to na język, który da się skompilować dla różnych systemów.

Ale i tak wolę czytelną składnię typu
IF CHR$ (PEEK a) = "A" THEN PRINT a
niż np.
IF !%A%! == 'A' > A.TXT
AY Music, ULA plus.

gregoryi

  • ****
  • Wiadomości: 288
  • Miejsce pobytu:
    Opole
Odp: Windows CMD - jak rozpoznać i zamienić [CR][LF]
« Odpowiedź #6 dnia: 2018.02.25, 22:19:54 »
Pierwsza linia do usunięcia

trochę duże ale to cmd.
Nie udało mi się znaleźć jaki kod wstawić by włożyć do pliku enter zamiast _CRLF_
Skrypt na szybko trochę na około.

A jak chciałbyś użyć powershell'a, to:
(Get-Content _spl_.INI) |
Foreach-Object {$_ -replace "_CRLF_","`r`n"} |
Set-Content _spl__.INI

Pozdrawiam
« Ostatnia zmiana: 2018.02.25, 23:30:27 wysłana przez gregoryi »
ZX Spectrum 16, ZX Spectrum 48, ZX Spectrum 128 +2 Grey, ZX Spectrum 128 +3, Amstrad 6128, Commodore 64C, Amiga 600, Klony - Harlequin 48 Rev G, Harlequin 128 Rev 2D, Just Speecy 128, ZX Nuvo 128

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Windows CMD - jak rozpoznać i zamienić [CR][LF]
« Odpowiedź #7 dnia: 2018.02.26, 05:10:30 »
Chodzi. Jeszcze nie sprawdziłem na innych .ini, ale przykładowy działa. Może niepotrzebnie wstawia spację przed [CR][LF] w niektórych liniach, ale AY Maker akceptuje to.
Dzięki bardzo.
AY Music, ULA plus.

gregoryi

  • ****
  • Wiadomości: 288
  • Miejsce pobytu:
    Opole
Odp: Windows CMD - jak rozpoznać i zamienić [CR][LF]
« Odpowiedź #8 dnia: 2018.02.26, 07:33:24 »
Jak masz %% a >> _maker.ini to we wszystkich usuń spację jak jest.
Zamiast %% a >> _maker.ini ma być
              %%a>> _maker.ini
W nocy pisałem i przeoczyłem.
ZX Spectrum 16, ZX Spectrum 48, ZX Spectrum 128 +2 Grey, ZX Spectrum 128 +3, Amstrad 6128, Commodore 64C, Amiga 600, Klony - Harlequin 48 Rev G, Harlequin 128 Rev 2D, Just Speecy 128, ZX Nuvo 128

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Windows CMD - jak rozpoznać i zamienić [CR][LF]
« Odpowiedź #9 dnia: 2018.02.26, 15:39:42 »
Super.
Może mi ktoś jeszcze powiedzieć, jak pobrać nazwę pierwszego pliku .ay z folderu bez ścieżki dysku i folderu?
Mniej więcej:
if exist *.ay set ayfilename= ...?
AY Music, ULA plus.

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Windows CMD - jak rozpoznać i zamienić [CR][LF]
« Odpowiedź #10 dnia: 2018.02.26, 19:13:26 »
Bardzo ładnie rozdziela plik na sekcję nagłówka i każdego utworu.
Jednak to działa tylko z tym konkretnym przykładowym plikiem .ini
W innych .ini niewiele daje dlatego, że ilość utworów NewSong może być różna.
Tak samo ilość CodeName i CodeAddress też jest różna, więc różna jest ilość linii w każdej sekcji NewSong.

Gdy w pliku jest tylko jedna para CodeName CodeAddress, to kolejne linie wychodzą
CodeName=temp\_spl_0_1.BIN
CodeAddress=49152
ECHO is off.
ECHO is off.

Gdy jest więcej utwórów niż 2, to nie są brane pod uwagę. Tutaj można zastosować pętlę do kolejnego NewSong,
Mi chodzi o najważniejsze, czyli która część wstawia do pliku nowy wiersz?
Czy to jest
echo %%r>> _maker.ini
i czym różni się >> od pojedynczego >


Widzę, że najpierw zamieniasz _CRLF_ na znak ; a później na ~
Separator mógł być dowolny. Wybrałem taki z uwagi na znikome prawdopodobieństwo pojawienia się tego w tytule utworu, pseudonimie czy innej zmiennej tekstowej. Jeśli masz pomysł na inny separator, to zaraz to poprawię.


DODANE:

W sumie miałbym tylko jedną prośbę. Czy mógłbyś przerobić to, żeby każdą linię exportował do osobnego pliku (lub zmiennej),
a następnie złożył z nich plik _maker.ini
Ja nie orientuję się absolutnie w tych delimiterach.
Czy mogę zdefiniować na początku, że znacznikiem końca linii jest _CRLF_ i wg niego plik zostanie podzielony na linie?
Dla ułatwienia teraz AY Splitter dodaje EOF na końcu pliku i może lecieć w pętli.

W załączniku inny plik .ini
« Ostatnia zmiana: 2018.02.26, 19:40:41 wysłana przez Abrimaal »
AY Music, ULA plus.

gregoryi

  • ****
  • Wiadomości: 288
  • Miejsce pobytu:
    Opole
Odp: Windows CMD - jak rozpoznać i zamienić [CR][LF]
« Odpowiedź #11 dnia: 2018.02.26, 22:24:17 »
W języku skryptowym cmd niestety są, tragiczne ograniczenia.
Pętla for może przyjąć jedynie 31 parametrów, a w pliku przykładowym było 43.
Zamieniam tak naprawdę _CRLF_ na ; i później ;NewSong; na ~ do podziału na poszczególne pliki.
Znalazłem na necie plik o nazwie sed.exe (nie wiem tylko jak ze stroną kodową), działa podobnie jak ten skrypt w powershellu.
Jest na licencji GNU, więc do użytku niezarobkowego nadaje się.
Jeszcze nie testowałem jak działa, ale można użyć go do tego zadania.
Chyba, że dostanę maksymalnie duży plik ini, to postaram się przerobić by był uniwersalny.
Nie wiedziałem, że pliki ini są różne.
ZX Spectrum 16, ZX Spectrum 48, ZX Spectrum 128 +2 Grey, ZX Spectrum 128 +3, Amstrad 6128, Commodore 64C, Amiga 600, Klony - Harlequin 48 Rev G, Harlequin 128 Rev 2D, Just Speecy 128, ZX Nuvo 128

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Windows CMD - jak rozpoznać i zamienić [CR][LF]
« Odpowiedź #12 dnia: 2018.02.26, 23:14:06 »
Wypróbuję ten plik. ale najpierw jeszcze coś innego.

Jeśli przez TYPE daje się operować na plikach tekstowych zawierających [CR][LF], można z kilku złożyć jeden,
to pewnie uda się też je rozłożyć na części
i niepotrzebna będzie zamiana nowej linii na tymczasowy separator.
Trudno powiedzieć, w jaki sposób odczytać dane i przypisać je zmiennym, aby były edytowalne,
czyli skrypt powinien czytać kolejne linie od znaku = (po Author= itd.) do separatora.
Liczniki plików i pętle już przerobiłem, tak że z tym nie będzie chyba problemu.

Właśnie przed chwilą wypróbowałem tworzenie playlisty dla emulatora
type ^aylplaylistid.txt ^playlist.txt>playlist.ayl
Plik aylplaylistid.txt zawiera identyfikator playlisty zakończony [CR][LF]
a plik playlist.txt to lista utworów, każdy w osobnej linii
Instrukcja powyżej utworzyła plik playlisty z obu plików tekstowych.

Może ja zaprezentuję, co do tej pory zrobiłem w temacie Edytor plików .AY,
Choć jeszcze nic nie chodzi, zorientujesz się co program w command line ma robić.

http://www.speccy.pl/forum/index.php?topic=3037.0

Dużo tam na początku było o tym w czym napisać od nowa główne pliki AYMaker i AYSplitter, ale jeśli już mam kompilator Pascal, bo w nim były pisane, to zawsze można próbować dostosować oryginały. Struktura plików AY jest naprawdę skomplikowana.



AY Music, ULA plus.

gregoryi

  • ****
  • Wiadomości: 288
  • Miejsce pobytu:
    Opole
Odp: Windows CMD - jak rozpoznać i zamienić [CR][LF]
« Odpowiedź #13 dnia: 2018.02.27, 00:17:49 »
Na obecną chwilę co znalazłem i działa.
Niestety nie w czystym cmd ale za pomocą trzech plików unixutils:
1. sed zamiana znaku _CRLF_EOL i _CRLF_ na średnik (pod cmd nie przyjmuje znaku, ani CR ani LF)
2. tr konwersja średnik na LF (ten dziadyga nie potrafi dodać CR)
3. unix2dos konwertuje LF na CRLF.

Wszystko działa jak powinno być.

p.s.
Wczytam się w temat AYGOR i zobaczę o co chodzi.
ZX Spectrum 16, ZX Spectrum 48, ZX Spectrum 128 +2 Grey, ZX Spectrum 128 +3, Amstrad 6128, Commodore 64C, Amiga 600, Klony - Harlequin 48 Rev G, Harlequin 128 Rev 2D, Just Speecy 128, ZX Nuvo 128

smok.wawelski

  • ***
  • Wiadomości: 225
  • Miejsce pobytu:
    Warszawa
Odp: Windows CMD - jak rozpoznać i zamienić [CR][LF]
« Odpowiedź #14 dnia: 2018.02.27, 08:07:38 »
UnxTools powinieneś "opędzić" jednym narzędziem - sedem lub awk, nie ma potrzeby 3 :)