CMD BAT - problem z interpretacją "znaku specjalnego" z pliku

Przygotowałem skrypt, który analizuje plik tekstowy pod kątem wybranego ciągu znaków (polecenie findstr). Przygotowałem też zliczanie ilości linii z pliku oraz wyświetlanie numeru linii, w której wystąpił ten znak. Np. wyszykuję ciągu znaków “abc” i załóżmy, że abc będzie w drugiej linii to wyświetli mi na ekranie:

Linia 2: abc

Proste prawda?

Napotykam jednak problem w przypadku, gdy w wyszukiwanej linii wystąpi “znak specjalny” pipe, czyli |. Załóżmy, ze druga linia pliku tekstowego to:

abc | coś tam | coś tam

Wtedy zamiast
Linia 2: abc

dostaję na ekranie:
"cos tam" is not recognized as an internal or external command,
operable program or batch file.

Jak zmusić BAT, żeby ignorował tego typu znaki specjalne w pobierane z pliku tekstowego? Jedyne, co osiągnąłem to dać cudzysłów dla zmiennej, ale wtedy otrzymam
"Linia 2: abc"

a to tak nieelegancko wygląda w batchu :slight_smile:

Witaj.

Spróbuj zamienić lub usunąć każdy znak specjalny znaleziony w ciągu

kod ogólny:
Jeśli w var jest symbol |
to zamień na _

To tylko przykład
Zwróć uwagę na ten temat

Wiem, ale nie chcę zmieniać zawartości pliku. Chcę, żeby polecenie echo ignorowało pipe’a.

No to może wyjść, że trzeba to jakoś wprowadzić do zmiennej, na niej dodać komentowanie pipe i dopiero wyświetlać zmienną?

1 polubienie

Spróbuj tak, znak escape
^|

Znak escape ^ tekst za nim jest traktowany jako zwykły tekst.

Wiem, ale to muszę w pliku źródłowym podmienić, bo “w locie” się nie da.

Powinno się dać to zrobić w locie.

Najpierw wyświetlasz ten tekst i podmieniasz
| na ^| i pipem wynik tego dajesz do swojego skryptu
oczywiście przy zamianie zmieniasz ^| na ^^^^| aby to traktowane było jako zwykły tekst.

1 polubienie

Kto co robi ten plik?
Nie można mu dać do separatora escape character?

Może on analizuje tabelki markdown?

No chyba lepiej je robić z pipe i półpauz niż html-em:

https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#tables
https://www.markdownguide.org/extended-syntax/#tables
https://help.github.com/en/github/writing-on-github/organizing-information-with-tables

Działa! Po testach okazało się, ze wystarczyło jednego “znaku ucieczki”. Swoją drogą to dziwne, że komenda echo, która ma tylko czytać tekst interpretuje jakieś znaki specjalne.

set /a "l=0"
for /f “tokens=*” %%L in (‘type “plik.txt”’) do (
set "txt=%%L"
set "ftxt=!txt:|=^|!"
set /a "l=!l!+1"
set "linia=Linia !l!: "
echo !linia!!ftxt! | find "b"
)
pause > nul

Niestety okazało się, że skrypt ignoruje puste linie między wierszami i ich nie liczy…