![]() |
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" таким методом типо удалиться знал) Как решить? |
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 |
Iska, копирование проходит отлично если в текстовом файле лишь символы или же он абсолютно пуст. Но если создать несколько текстовых файлов, к примеру 1.txt, 2.txt, 3.txt и в них сохранить несколько пустых строчек("потапать" enter на клавиатуре), то после копирования содержимого в один файл там обнаружится куча этих "невидимых" символов. Вот именно от них и нужно избавиться. Наверное это "символы переноса каретки".
|
Цитата:
Скрытый текст
![]() Цитата:
Понимаете, есть такое понятие как кодировка файлов (плюс сюда же наличие/отсутствие BOM). Это раз. Второе — типы концов строк тоже бывают разными — пара CrLf для DOS/Windows, Lf для Unix и Cr для Mac. И чтобы в общем случае правильно склеить текстовые файлы с одновременным удалением пустых строк крайне желательно представлять с каким именно исходным материалом предстоит работать. В частном случае — да, можно попробовать обойтись пакетным файлом, наподобие (по причине отсуствия представленных образцов файлов — не проверялось): Код:
@echo off |
Вот папка из диска C.
Ещё раз попытаюсь обрисовать суть батника из папки: Есть несколько текстовых файлов 00.txt, 1.txt, 2.txt и т.п. Их содержимое копируется в один файл - 0.txt. В файле 00.txt всегда неизменно один символ 0 - это метка она нам понадобится. В других же файлах таких как 1.txt, 2.txt и т.п. может быть какая-то цифра. К примеру соответствующая номеру самого файла. А может быть и пустая строка, и две пустые строки. А дальше батник анализирует содержимое файла 0.txt, и если в файле лишь 0, то запускает блокнот, а если ещё какие-то символы то ничего не происходит. |
Вложений: 1
ПАПКА
|
NLOLegion, ну, вот о чём я и говорил — Unix:
![]() Цитата:
Скрытый текст
![]() С какими именно файлами мы должны работать, как их отделить от прочих в каталоге? В каком порядке должно осуществляться слияние? Если имена числовые, то а) сколько будет файлов и б) почему у Вас слияние такого странного вида — «00+1+2+…N→0», а не, например, «0+1+2+…N→Result»? Видите, сколько вопросов. |
Цитата:
Имена числовые для простоты. Их названия не принципиальны. В папке с файлами которые будут "сливаться" могут быть и другие не учавствующие в данном процессе 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 |
NLOLegion, тогда чем Вас не устраивает предложенный выше код? Я беру Ваши файлы:
Код:
@echo off ![]() Что не так?! |
Цитата:
А в данном случае не так работает следующий код: 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, да меня самого этот вопрос уже задрал! А цель одна - в txt файле собранном из нескольких любых должны остаться только цифры и не единого символа! Ни начала строк, ни пробелов и табов, ни разрывов строк и переносов каретки.
И этот результат мне гасит работу большого количества батников. Надо как-то решить. |
Победил! Сейчас опишу!
|
Вложений: 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-ом. Вообщем не решил задачу, а обошёл. |
NLOLegion, проблема в том, что Вы нам излагаете не исходную задачу, а уже выбранный Вами путь решения. И мы занимаемся тем, что боремся с последствиями выбранного Вами решения, а не решением основной, известной Вам, но неизвестной нам, задачи.
|
Iska, это отчасти так, и вам всем, и особенно тебе очень благодарен за постоянную помощь и решения. Но в конкретном случае мне нужно было удаление этих "невидимок", и задачу решённой я считать не могу. именно удаление этих символов мне нужно в большом количестве разных по задачам батников.
А исходная задача простая - Любой батник запустился и записал в свой файл циферку 1. И так другие батники глядя в этот файл могут запускать те или иные задачи. Ну например. Есть в исходном файле строчка "Меня достала эта отвратительная погода". sed её разберёт по слову и каждому слову присвоит метку- цифру. Следующим действием будет запуск батника который найдёт эти цифры, и соответствующие этим цифрам библиотеки фраз сформирует в один ответ (не без рандома) что-то типа "Такая погода продлиться не долго, тепло и солнечно будет такого-то числа". Каждое слово будет подбираться в зависимости от уже начатых подбираться слов. |
Время: 16:14. |
Время: 16:14.
© OSzone.net 2001-