Показать полную графическую версию : SED. Символы "невидимки". Как удалить?
NLOLegion
08-11-2017, 04:58
Делаю копирование содержимого нескольких файлов в один методом:
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
Если не получится — упаковывайте Ваши файлы в архив и выкладывайте, будем смотреть что в оригиналах.
NLOLegion
09-11-2017, 07:45
Iska, копирование проходит отлично если в текстовом файле лишь символы или же он абсолютно пуст. Но если создать несколько текстовых файлов, к примеру 1.txt, 2.txt, 3.txt и в них сохранить несколько пустых строчек("потапать" enter на клавиатуре), то после копирования содержимого в один файл там обнаружится куча этих "невидимых" символов. Вот именно от них и нужно избавиться. Наверное это "символы переноса каретки".
Но если создать несколько текстовых файлов, к примеру 1.txt, 2.txt, 3.txt и в них сохранить несколько пустых строчек("потапать" enter на клавиатуре), то после копирования содержимого в один файл там обнаружится куча этих "невидимых" символов. »
NLOLegion, всё правильно, так и должно быть. И символы эти вполне видимы — как результат отображения отдельных строк, а не сплошного текста. Либо можно взять любой вменяемый редактор и включить отображение служебных/непечатаемых символов:
https://i.imgur.com/I0pWmFq.png
Вот именно от них и нужно избавиться. »
И хде Ваш архив с образцами файлов, о котором я просил выше ;)?
Понимаете, есть такое понятие как кодировка файлов (плюс сюда же наличие/отсутствие 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
Вот папка из диска 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
ПАПКА
NLOLegion, ну, вот о чём я и говорил — Unix:
https://i.imgur.com/b6H97gk.png
Есть несколько текстовых файлов 00.txt, 1.txt, 2.txt и т.п. »
Переданные Вами файлы:
https://i.imgur.com/zlx0cjD.png
С какими именно файлами мы должны работать, как их отделить от прочих в каталоге? В каком порядке должно осуществляться слияние? Если имена числовые, то а) сколько будет файлов и б) почему у Вас слияние такого странного вида — «00+1+2+…N→0», а не, например, «0+1+2+…N→Result»?
Видите, сколько вопросов.
NLOLegion
09-11-2017, 11:57
у, вот о чём я и говорил — 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
NLOLegion, тогда чем Вас не устраивает предложенный выше код (http://forum.oszone.net/post-2776303.html#post2776303)? Я беру Ваши файлы:
@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
и получаю:
https://i.imgur.com/hV1Ky9a.png
Что не так?!
NLOLegion
09-11-2017, 13:37
Что не так?! »
Этот способ работает, но не так как хотелось бы. В идеале цифры в один ряд должны быть и больше не единого символа.
А в данном случае не так работает следующий код:
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. Следовательно блокнот не должен запускаться.
В идеале »
(продолжаю строку)... вы бы назвали конкретную задачу (хотелку) и ее цель, все выше это решения и глядишь, вам возможно подскажут и даже сделают все гораздо удобным, правильным и лаконичным способом.
NLOLegion
09-11-2017, 14:10
alpap, да меня самого этот вопрос уже задрал! А цель одна - в txt файле собранном из нескольких любых должны остаться только цифры и не единого символа! Ни начала строк, ни пробелов и табов, ни разрывов строк и переносов каретки.
И этот результат мне гасит работу большого количества батников. Надо как-то решить.
NLOLegion
09-11-2017, 15:15
Победил! Сейчас опишу!
NLOLegion
09-11-2017, 15:33
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, проблема в том, что Вы нам излагаете не исходную задачу, а уже выбранный Вами путь решения. И мы занимаемся тем, что боремся с последствиями выбранного Вами решения, а не решением основной, известной Вам, но неизвестной нам, задачи.
NLOLegion
10-11-2017, 06:57
Iska, это отчасти так, и вам всем, и особенно тебе очень благодарен за постоянную помощь и решения. Но в конкретном случае мне нужно было удаление этих "невидимок", и задачу решённой я считать не могу. именно удаление этих символов мне нужно в большом количестве разных по задачам батников.
А исходная задача простая - Любой батник запустился и записал в свой файл циферку 1. И так другие батники глядя в этот файл могут запускать те или иные задачи.
Ну например. Есть в исходном файле строчка "Меня достала эта отвратительная погода". sed её разберёт по слову и каждому слову присвоит метку- цифру. Следующим действием будет запуск батника который найдёт эти цифры, и соответствующие этим цифрам библиотеки фраз сформирует в один ответ (не без рандома) что-то типа "Такая погода продлиться не долго, тепло и солнечно будет такого-то числа". Каждое слово будет подбираться в зависимости от уже начатых подбираться слов.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.