Cmd удалить пробелы в файле
Здравствуйте. Помогите, пожалуйста, написать следующий bat-файл.
Дан .txt файл следующего вида:
(строка символов, перемежающихся пробелами)
(строка из 15 пробелов в начале, и после них символы)
(строка из 15 пробелов)
(пустая строка (тупо перенос; в предыдущей строке нажали enter); потом снова enter)
(строка символов, перемежающихся пробелами)
(строка из 15 пробелов в начале, и после них символы)
(строка из 15 пробелов)
(пустая строка)
и т.д.
Во-первых, нужно удалить переносы. Т.е. чтобы пустых строк не было. Это я понял, как можно реализовать.
Во-вторых, нужно удалить строки, состоящие только из пробелов.
Т.е. чтобы строки вида "сначала куча (15) пробелов, а потом другие символы" остались.
Не знаю, как это сделать. всё перепробовал.
Варианты
не пашут. Собственно, вопрос можно свести к другому: как заставить cmd "понимать" символ "пробел"? если в findstr \s не реализовано, и он воспринимает эту запись буквально как "\s".
Добавлено через 7 минут
P.S. в вариантах: забыл * после "пробела" во втором и третьем вариантах.
Добавлено через 4 минуты
Если будет предложено решение с удалением строк типа
(произвольное количество пробелов)символы.
- буду благодарен.
Удаление пробелов
День бодрый. Пожалуйста подскажите как из строки удалить все пробелы?
Вывод строки пробелов без переноса, или как обойти спецсимволы?
Написал код вывода дерева папок наподобие tree. Все вроде работает, но вывод пробелов без переноса.
Поиск по заданному выражению строки в файле и удаление найденной строки и нескольких прилежащих к ней строк
Доброго времени суток! Помогите, пожалуйста, разобраться. У меня лог файл, из которого мне нужно.
Удаление ПО с командной строки
Добрый день , подскажите , для оптимизации и всевозможных ситуаций . прошу помочь в обьединении .
Конфигурация компьютера | |
Процессор: Intel i3 330 | |
Материнская плата: GIGABYTE GA-H55N-USB3 (rev. 1.0) | |
Память: Samsung DDR3 1333 DIMM 2Gb | |
HDD: 160Gb | |
Видеокарта: IN i3 GA-H55N | |
Звук: 7.1CH, HDA, Realtek ALC892R | |
Блок питания: 500w nnm | |
CD/DVD: USB | |
Монитор: BenQ E2220HD | |
ОС: Windows 7 Ultimate x64 | |
Индекс производительности Windows: Win+Pause |
Конфигурация компьютера | |
Процессор: Intel(R) Core(TM) i3 CPU M 370 2.40GHz, ядер: 2, логических процессоров: 4 | |
Память: 8,00 ГБ | |
ОС: Windows 10 Pro x64 |
наверное надо показать содержимое файла и его кодировку или как надо догадываться от чего это может быть?
Конфигурация компьютера | |
Процессор: Intel i3 330 | |
Материнская плата: GIGABYTE GA-H55N-USB3 (rev. 1.0) | |
Память: Samsung DDR3 1333 DIMM 2Gb | |
HDD: 160Gb | |
Видеокарта: IN i3 GA-H55N | |
Звук: 7.1CH, HDA, Realtek ALC892R | |
Блок питания: 500w nnm | |
CD/DVD: USB | |
Монитор: BenQ E2220HD | |
ОС: Windows 7 Ultimate x64 | |
Индекс производительности Windows: Win+Pause |
wmic bios get serialnumber>>С:\%computername%-serial-%date%.txt 2>>&1
: Пробелы в конце обеих строк.
Конфигурация компьютера | |
Процессор: Intel(R) Core(TM) i3 CPU M 370 2.40GHz, ядер: 2, логических процессоров: 4 | |
Память: 8,00 ГБ | |
ОС: Windows 10 Pro x64 |
merdzd,
в данном случае виноват именно wmic, он и почуднее бывает выводит что приходится двумя for выводить. В вашем случае можно так:
Конфигурация компьютера | |
Процессор: Intel i3 330 | |
Материнская плата: GIGABYTE GA-H55N-USB3 (rev. 1.0) | |
Память: Samsung DDR3 1333 DIMM 2Gb | |
HDD: 160Gb | |
Видеокарта: IN i3 GA-H55N | |
Звук: 7.1CH, HDA, Realtek ALC892R | |
Блок питания: 500w nnm | |
CD/DVD: USB | |
Монитор: BenQ E2220HD | |
ОС: Windows 7 Ultimate x64 | |
Индекс производительности Windows: Win+Pause |
Конфигурация компьютера | |
Процессор: Intel(R) Core(TM) i3 CPU M 370 2.40GHz, ядер: 2, логических процессоров: 4 | |
Память: 8,00 ГБ | |
ОС: Windows 10 Pro x64 |
наверное надо показать содержимое файла и его кодировку или как надо догадываться от чего это может быть?
Конфигурация компьютера | |
Процессор: Intel i3 330 | |
Материнская плата: GIGABYTE GA-H55N-USB3 (rev. 1.0) | |
Память: Samsung DDR3 1333 DIMM 2Gb | |
HDD: 160Gb | |
Видеокарта: IN i3 GA-H55N | |
Звук: 7.1CH, HDA, Realtek ALC892R | |
Блок питания: 500w nnm | |
CD/DVD: USB | |
Монитор: BenQ E2220HD | |
ОС: Windows 7 Ultimate x64 | |
Индекс производительности Windows: Win+Pause |
wmic bios get serialnumber>>С:\%computername%-serial-%date%.txt 2>>&1
: Пробелы в конце обеих строк.
Конфигурация компьютера | |
Процессор: Intel(R) Core(TM) i3 CPU M 370 2.40GHz, ядер: 2, логических процессоров: 4 | |
Память: 8,00 ГБ | |
ОС: Windows 10 Pro x64 |
merdzd,
в данном случае виноват именно wmic, он и почуднее бывает выводит что приходится двумя for выводить. В вашем случае можно так:
Конфигурация компьютера | |
Процессор: Intel i3 330 | |
Материнская плата: GIGABYTE GA-H55N-USB3 (rev. 1.0) | |
Память: Samsung DDR3 1333 DIMM 2Gb | |
HDD: 160Gb | |
Видеокарта: IN i3 GA-H55N | |
Звук: 7.1CH, HDA, Realtek ALC892R | |
Блок питания: 500w nnm | |
CD/DVD: USB | |
Монитор: BenQ E2220HD | |
ОС: Windows 7 Ultimate x64 | |
Индекс производительности Windows: Win+Pause |
Конфигурация компьютера | |
Процессор: Intel(R) Core(TM) i3 CPU M 370 2.40GHz, ядер: 2, логических процессоров: 4 | |
Память: 8,00 ГБ | |
ОС: Windows 10 Pro x64 |
наверное надо показать содержимое файла и его кодировку или как надо догадываться от чего это может быть?
Конфигурация компьютера | |
Процессор: Intel i3 330 | |
Материнская плата: GIGABYTE GA-H55N-USB3 (rev. 1.0) | |
Память: Samsung DDR3 1333 DIMM 2Gb | |
HDD: 160Gb | |
Видеокарта: IN i3 GA-H55N | |
Звук: 7.1CH, HDA, Realtek ALC892R | |
Блок питания: 500w nnm | |
CD/DVD: USB | |
Монитор: BenQ E2220HD | |
ОС: Windows 7 Ultimate x64 | |
Индекс производительности Windows: Win+Pause |
wmic bios get serialnumber>>С:\%computername%-serial-%date%.txt 2>>&1
: Пробелы в конце обеих строк.
Конфигурация компьютера | |
Процессор: Intel(R) Core(TM) i3 CPU M 370 2.40GHz, ядер: 2, логических процессоров: 4 | |
Память: 8,00 ГБ | |
ОС: Windows 10 Pro x64 |
merdzd,
в данном случае виноват именно wmic, он и почуднее бывает выводит что приходится двумя for выводить. В вашем случае можно так:
set "charlist primer"> set str=Как утомляет симулировать нормальность echo.%str% set str=%str:~-12% echo.%str%
Извлечение подстроки с начала строки
Извлечение подстроки с середины строки
echo.Date : %date% echo.Weekday: %date:~0,3% echo.Month : %date:~4,2% echo.Day : %date:~7,2% echo.Year : %date:~10,4%
Удаление первого и последнего символа в строке
(часто этот прием используют для удаления окаймляющих кавычек)
Удаление подстроки в строке
В данном примере из строки будет удалена подстрока "кожа "
Удаление всех пробелов в строке
Как вариант предыдущего примера
Замена подстроки в строке
set str=Я тебя раскусил, ты оборотень: то как человек, то как баран set str=%str:то=иногда% echo %str%
Объединение строк
Удаление ведущих пробелов
set str= Не ждите чуда, чудите сами echo."%str%" for /f "tokens=* delims= " %%a in ("%str%") do set str=%%a echo."%str%"
Конвертровать большие буквы в маленькие
:toLower str -- converts uppercase character to lowercase :: -- str [in,out] - valref of string variable to be converted :$created 20060101 :$changed 20080219 :$categories StringManipulation :$source http://www.dostips.com if not defined %~1 EXIT /b for %%a in ("A=a" "B=b" "C=c" "D=d" "E=e" "F=f" "G=g" "H=h" "I=i" "J=j" "K=k" "L=l" "M=m" "N=n" "O=o" "P=p" "Q=q" "R=r" "S=s" "T=t" "U=u" "V=v" "W=w" "X=x" "Y=y" "Z=z" "А=а" "Б=б" "В=в" "Г=г" "Д=д" "Е=е" "Ж=ж" "З=з" "И=и" "К=к" "Л=л" "М=м" "Н=н" "О=о" "П=п" "Р=р" "С=с" "Т=т" "У=у" "Ф=ф" "Х=х" "Ц=ц" "Ч=ч" "Ш=ш" "Щ=щ" "Ь=ь" "Ы=ы" "Ъ=ъ" "Э=э" "Ю=ю" "Я=я") do ( call set %~1=%%%~1:%%~a%% ) EXIT /b
ЗАМЕНА ОДНОЙ ПОДСТРОКИ НА ДРУГУЮ В ФАЙЛЕ
В результате, в папке, где будет запущен приведенный выше текст, создастся файл sbs2.com.
Возможно, вы будете приятно удивлены его размером - 659 БАЙТ!
Те, кому вышеприведенные изыски кажутся излишними, могут скачать готовую утилиту здесь.
Использование:
sbs2.com 0 "Old String" "New String" < infile >outfile
Осуществляется замена всех вхождений Old String на New String в файле infile. Результат запишется в файл outfile.
Такую задачу можно решить без использования сторонних программ, только средствами bat !
Ниже приведен пример с использованием локальной процедуры txtrepl
setlocal ENABLEDELAYEDEXPANSION echo off call :txtrepl end finish C:\1\24i.bat C:\1\24i.ba1 pause exit :txtrepl rem param - find, repl, from, to set FINDTXT=%1 set REPLTXT=%2 if EXIST %3 ( set FILEFROM=%3 ) else ( echo error. Not found file %3 pause exit ) set FILEOUT=%4 set COUNT=0 for /F "tokens=*" %%n in (!FILEFROM!) do ( set /A COUNT=!COUNT!+1 set LINE=%%n set TMPR=!LINE:%FINDTXT%=%REPLTXT%! if !COUNT! == 1 ( Echo !TMPR!>!FILEOUT! ) else ( Echo !TMPR!>>!FILEOUT! ) ) exit /b rem end of proc
Вывод на экран, в файл текста без перевода строки
В bat/cmd командах не предусмотрена возможность вывода данных без перевода строки. Но для решения такой задачи можно использовать некую уловку.
Команда set с параметром, предусматривающим ввод данных с экрана, позволяет вывести подсказку для ввода без перевода строки. Вот этим мы и воспользуемся.
Соответственно, для вывода текста в файл без перевода строки используется конструкция:
b.txt
Использование этого приема в сочетании с символом backspace (код 08) позволяет сделать вывод на экран изменяемого текста и как вариант - "вращающейся палки".
Вычисление длины строковой переменной
В bat/cmd командах нет функции, позволяющей вычислять длину строковой переменной. А такая задача возникает не так уж и редко. Однако средств командного языка достаточно, для того что бы решить такую задачу, не прибегая к использованию специальных программ. Рассмотрим несколько вариантов решения данной задачи:
:var_count2 set /a %2 =0 set var=%~1 :startvarcount if not defined var exit /b set var=%var:~1% set /a %2+=1 goto startvarcount exit /b
Еще один вариант вычисления длины строковой переменной:
:StringLen :: ----------------------- :: Нахождение длины строки :: ----------------------- :: %1 - текстовая строка :: ----------------------- Set $StringLen=0 Set $StringBuf=%~1 If ""=="%~1" GoTo :EOF :StringLenLoop Set /A $StringLen+=1 Call Set $StringChr=%%$StringBuf:~%$StringLen%%% If ""=="%$StringChr%" GOTO :EOF GoTo :StringLenLoop
Еще один способ определения длины строки, как ни странно - достаточно быстрый:
@Echo Off Set a=qwertyuiop Echo.%a%>"%TEMP%\%~n0.tmp" For %%i In ("%TEMP%\%~n0.tmp") Do Set /A z=%%~zi-2 Echo %z%
Ну и, наконец, решение, поразившее меня своей математической лаконичностью:
:strLen string len -- returns the length of a string :: -- string [in] - variable name containing :: the string being measured for length :: -- len [out] - variable to be used :: to return the string length :: Many thanks to 'sowgtsoi', but also 'jeb' :: and 'amel27' dostips forum :: users helped making this short and efficient :$created 20081122 :$changed 20101116 :$categories StringOperation :$source http://www.dostips.com ( SETLOCAL ENABLEDELAYEDEXPANSION set "str=A!%~1!"&rem keep the A up front to ensure we rem get the length and not the upper bound rem it also avoids trouble in case of empty string set "len=0" for /L %%A in (12,-1,0) do ( set /a "len|=1%
Для себя я так же использую метод половинного деления для нахождения количества символов в строке. Эта процедура менее изящна, и, возможно, потребует несколько большего времени для вычислений, чем приведенная выше, но, на мой взгляд, она понятнее. (В этом месте надо было похвалить себя еще, но что-то не нашлось достойных эпитетов)
Привожу на всякий случай и эту процедуру ))
@echo off setlocal ENABLEEXTENSIONS SetLocal EnableDelayedExpansion set "string=123456789012345678901" call :strLen string len echo len=%len% pause exit :strLen string len :: - string [in] - variable name containing the string :: -- len [out] - variable to be used to return the string length SETLOCAL ENABLEDELAYEDEXPANSION set /a nn=10 & rem max length string = 2^^nn. rem If nn=10 - max length=1024 set /a mmin=0 set /a mmax=1"<<"%nn% set "str=Q!%1!" for /L %%A in (%nn%,-1,1) do ( set /a BB = ^(!mmin! + !mmax!^) ">>" 1 call set sim=%%str:~!BB!,1%% if "!sim!" == "" ( set /a mmax=!BB!) else ( set /a mmin=!BB! ) ) ENDLOCAL & SET /a %~2=%mmin% EXIT /b %mmin%
Получение подстроки.
Если смещение начала подстроки и ее длина являются константами - здесь все достаточно просто и аналогичный пример рассматривался выше:
Прошу прощения, если в качестве значения переменной str я опубликовал чей-то пароль )).
Если же одна или обе эти величины - переменные, то решение будет не столь простое.
Здесь встретиться возможно не совсем обычное применение команды CALL. Немного глубже об этом на странице Полезное в разделе Особенности использования команды CALL. Там же рассмотрен и этот пример.
Итак, рассмотрим возможные решения:
SetLocal EnableDelayedExpansion set str=123qwerty456 set n1=3 set n2=6 Set d2=!str:~%n1%,%n2%! Echo d2=%d2%
Или как вариант предыдущего
setlocal ENABLEEXTENSIONS SetLocal EnableDelayedExpansion set str=zaq12wsx set n1=3 set n2=6 call :SUBSTRING str,%n1%,%n2% echo %SUBD% . :SUBSTRING set SUBD=!%1:~%2,%3! exit /b
Удаление ведущих и замыкающих пробелов.
:ALLTRIM :: ----------------------- :: Krasner B. :: ----------------------- :: %1 - var with txt string :: ----------------------- SetLocal EnableDelayedExpansion set /a firstnoblank=-1 set /a lastnoblank=0 set /a curpos=1 set "str=Q!%1!" :StringLenLoop set SUBD=!str:~%curpos%,1! if "!SUBD!" == "" GoTo :formrez if NOT "!SUBD!" == " " ( if !firstnoblank! == -1 set firstnoblank=!curpos! set lastnoblank=!curpos! ) set /a curpos = !curpos!+1 GoTo :StringLenLoop :formrez set /a n1=!firstnoblank!-1 set /a n2=!lastnoblank!-!firstnoblank!+1 if !firstnoblank! == -1 (set "rez primer"> set "strr=" Call :ALLTRIM strr echo result ALLTRIM ^>%strr%^< . set "strrr= 22 33 " Call :ALLTRIM strrr echo result ALLTRIM ^>%strrr%^
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).
Новый раздел о средствах командной строки в рамках этого же проекта расположен здесь
Читайте также: