Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   SED. Символы "невидимки". Как удалить? (http://forum.oszone.net/showthread.php?t=331062)

NLOLegion 08-11-2017 04:58 2776087

SED. Символы "невидимки". Как удалить?
 
Делаю копирование содержимого нескольких файлов в один методом:
copy C:\A\Bats\Search\1search\6search.txt+C:\A\Bats\Search\2write\6write.txt+C:\A\Bats\Search\3wiki\6wiki .txt C:\A\Bats\Search\0uncertainty\metka.txt
(файлов с содержимым может быть и больше)
В файлах может быть "!",цифры, а может и ничего не быть. При подобном "соединение" получил файл со "строчкой" -
"!











1"
только у меня в обычном блокноте это выглядит как "!1", а между этими двумя символами около 12 "невидимых" символов. Не знаю как называются. А самое главное Как от них избавиться оставив всё содержимое? Табы и пробелы не нужны если будут. Только видимые символы. В идеале выполнить это sed-ом, и желательно в одну простую строчку команду.
пробовал удалить всё после "!" так - C:\A\Bats\Search\sed.exe s/!.+// C:\A\Bats\Search\0uncertainty\metka.txt>C:\A\Bats\Search\0uncertainty\metka2.txt - не работает. (Что "1" таким методом типо удалиться знал)
Как решить?

Iska 08-11-2017 06:09 2776092

NLOLegion, делайте так:
Код:

copy /b C:\A\Bats\Search\1search\6search.txt+C:\A\Bats\Search\2write\6write.txt+C:\A\Bats\Search\3wiki\6wiki .txt C:\A\Bats\Search\0uncertainty\metka.txt
Если не получится — упаковывайте Ваши файлы в архив и выкладывайте, будем смотреть что в оригиналах.

NLOLegion 09-11-2017 07:45 2776295

Iska, копирование проходит отлично если в текстовом файле лишь символы или же он абсолютно пуст. Но если создать несколько текстовых файлов, к примеру 1.txt, 2.txt, 3.txt и в них сохранить несколько пустых строчек("потапать" enter на клавиатуре), то после копирования содержимого в один файл там обнаружится куча этих "невидимых" символов. Вот именно от них и нужно избавиться. Наверное это "символы переноса каретки".

Iska 09-11-2017 08:35 2776303

Цитата:

Цитата NLOLegion
Но если создать несколько текстовых файлов, к примеру 1.txt, 2.txt, 3.txt и в них сохранить несколько пустых строчек("потапать" enter на клавиатуре), то после копирования содержимого в один файл там обнаружится куча этих "невидимых" символов. »

NLOLegion, всё правильно, так и должно быть. И символы эти вполне видимы — как результат отображения отдельных строк, а не сплошного текста. Либо можно взять любой вменяемый редактор и включить отображение служебных/непечатаемых символов:
Скрытый текст


Цитата:

Цитата NLOLegion
Вот именно от них и нужно избавиться. »

И хде Ваш архив с образцами файлов, о котором я просил выше ;)?

Понимаете, есть такое понятие как кодировка файлов (плюс сюда же наличие/отсутствие BOM). Это раз. Второе — типы концов строк тоже бывают разными — пара CrLf для DOS/Windows, Lf для Unix и Cr для Mac. И чтобы в общем случае правильно склеить текстовые файлы с одновременным удалением пустых строк крайне желательно представлять с каким именно исходным материалом предстоит работать.

В частном случае — да, можно попробовать обойтись пакетным файлом, наподобие (по причине отсуствия представленных образцов файлов — не проверялось):
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

>"C:\A\Bats\Search\0uncertainty\metka.txt" (
        for %%i in ("C:\A\Bats\Search\1search\6search.txt" "C:\A\Bats\Search\2write\6write.txt" "C:\A\Bats\Search\3wiki\6wiki.txt" "C:\A\Bats\Search\0uncertainty\metka.txt") do ^
                for /f "usebackq delims=" %%j in ("%%~i") do echo %%j
)

endlocal
exit /b 0


NLOLegion 09-11-2017 09:52 2776317

Вот папка из диска C.
Ещё раз попытаюсь обрисовать суть батника из папки:
Есть несколько текстовых файлов 00.txt, 1.txt, 2.txt и т.п.
Их содержимое копируется в один файл - 0.txt.
В файле 00.txt всегда неизменно один символ 0 - это метка она нам понадобится.
В других же файлах таких как 1.txt, 2.txt и т.п. может быть какая-то цифра. К примеру соответствующая номеру самого файла. А может быть и пустая строка, и две пустые строки.
А дальше батник анализирует содержимое файла 0.txt, и если в файле лишь 0, то запускает блокнот, а если ещё какие-то символы то ничего не происходит.

NLOLegion 09-11-2017 09:53 2776319

Вложений: 1
ПАПКА

Iska 09-11-2017 11:08 2776331

NLOLegion, ну, вот о чём я и говорил — Unix:


Цитата:

Цитата NLOLegion
Есть несколько текстовых файлов 00.txt, 1.txt, 2.txt и т.п. »

Переданные Вами файлы:
Скрытый текст

С какими именно файлами мы должны работать, как их отделить от прочих в каталоге? В каком порядке должно осуществляться слияние? Если имена числовые, то а) сколько будет файлов и б) почему у Вас слияние такого странного вида — «00+1+2+…N→0», а не, например, «0+1+2+…N→Result»?

Видите, сколько вопросов.

NLOLegion 09-11-2017 11:57 2776349

Цитата:

Цитата Iska
у, вот о чём я и говорил — Unix: »

мне просто нужно оставить Только цифры если они есть
Имена числовые для простоты. Их названия не принципиальны. В папке с файлами которые будут "сливаться" могут быть и другие не учавствующие в данном процессе txt файлы.
а) файлов может быть любое количество (нужно использовать именно пути с именами (что-то типа C:\A\Bats\Search\0uncertainty\1.txt)
б) это просто названия. они могут быть разные. никакой закономерности.

В идеале выполнить удаление "переноса каретки" именно sed-ом. Но это в идеале.
Сейчас пилю что-то типа
C:\A\Bats\Search\sed.exe -e ":a;N;$!ba;s/\n//g" C:\A\Bats\Search\0uncertainty\000.txt>C:\A\Bats\Search\0uncertainty\0000.txt
но в итоге один перенос каретки(или "разрыв строк") всё равно остаётся после слитых цифр из txt

Iska 09-11-2017 12:49 2776368

NLOLegion, тогда чем Вас не устраивает предложенный выше код? Я беру Ваши файлы:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

>"0.txt" (
        for %%i in (00.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt 10.txt 11.txt 13.txt) do for /f "usebackq delims=" %%j in ("%%~i") do echo %%j
)

endlocal
exit /b 0

и получаю:

Что не так?!

NLOLegion 09-11-2017 13:37 2776384

Цитата:

Цитата Iska
Что не так?! »

Этот способ работает, но не так как хотелось бы. В идеале цифры в один ряд должны быть и больше не единого символа.
А в данном случае не так работает следующий код:

setlocal
for /f "tokens=*" %%i in ('dir /b /s C:\New\*.txt') do (
1>nul findstr "\<%%~ni\>" "%%i" && call:exec %%~ni
)
goto:eof
:exec
if %1 equ 0 start notepad
Exit /b

ведь в файле "0.txt" не только 0, но и 1. Следовательно блокнот не должен запускаться.

alpap 09-11-2017 13:49 2776387

Цитата:

Цитата NLOLegion
В идеале »

(продолжаю строку)... вы бы назвали конкретную задачу (хотелку) и ее цель, все выше это решения и глядишь, вам возможно подскажут и даже сделают все гораздо удобным, правильным и лаконичным способом.

NLOLegion 09-11-2017 14:10 2776390

alpap, да меня самого этот вопрос уже задрал! А цель одна - в txt файле собранном из нескольких любых должны остаться только цифры и не единого символа! Ни начала строк, ни пробелов и табов, ни разрывов строк и переносов каретки.
И этот результат мне гасит работу большого количества батников. Надо как-то решить.

NLOLegion 09-11-2017 15:15 2776405

Победил! Сейчас опишу!

NLOLegion 09-11-2017 15:33 2776408

Вложений: 1
copy /b C:\New\00.txt+C:\New\1.txt+C:\New\2.txt+C:\New\3.txt+C:\New\4.txt+C:\New\x.txt C:\New\000.txt
C:\New\sed.exe -e ":a;N;$!ba;s/\n//g";s/x//g C:\New\000.txt>C:\New\0.txt
setlocal
for /f "tokens=*" %%i in ('dir /b /s C:\New\*.txt') do (
1>nul findstr "\<%%~ni\>" "%%i" && call:exec %%~ni
)
goto:eof
:exec
if %1 equ 0 start notepad
Exit /b


Добавил ещё один текстовый файл "C:\New\x.txt" в котором всего один символ латиницей "x" и больше ни одного символа и переноса каретки Нет! При копировании содержимого файлов в один этим символом замыкается всё полученное содержимое. А в дальнейшем все "пространства удаляются sed-ом.
Вообщем не решил задачу, а обошёл.

Iska 10-11-2017 00:27 2776537

NLOLegion, проблема в том, что Вы нам излагаете не исходную задачу, а уже выбранный Вами путь решения. И мы занимаемся тем, что боремся с последствиями выбранного Вами решения, а не решением основной, известной Вам, но неизвестной нам, задачи.

NLOLegion 10-11-2017 06:57 2776547

Iska, это отчасти так, и вам всем, и особенно тебе очень благодарен за постоянную помощь и решения. Но в конкретном случае мне нужно было удаление этих "невидимок", и задачу решённой я считать не могу. именно удаление этих символов мне нужно в большом количестве разных по задачам батников.
А исходная задача простая - Любой батник запустился и записал в свой файл циферку 1. И так другие батники глядя в этот файл могут запускать те или иные задачи.
Ну например. Есть в исходном файле строчка "Меня достала эта отвратительная погода". sed её разберёт по слову и каждому слову присвоит метку- цифру. Следующим действием будет запуск батника который найдёт эти цифры, и соответствующие этим цифрам библиотеки фраз сформирует в один ответ (не без рандома) что-то типа "Такая погода продлиться не долго, тепло и солнечно будет такого-то числа". Каждое слово будет подбираться в зависимости от уже начатых подбираться слов.


Время: 16:14.

Время: 16:14.
© OSzone.net 2001-