Cmd изменить строку в файле
set "charlist primer"> set str=Как утомляет симулировать нормальность echo.%str% set str=%str:~-12% echo.%str%
Извлечение подстроки с начала строки
Удаление ведущих и замыкающих пробелов.
: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%^
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).
Новый раздел о средствах командной строки в рамках этого же проекта расположен здесь
Нашел еще вот такой.
Как было написано этот батник разделяет файл по "--- ---".
Но он оставляет и пустые и закоментированные.
Помогите скрестить эти батники. Чтоб и нужную строку заменил и пустые строки с закоментированными оставил.
Замена строки в файле
Можно ли заменить строку по номеру? Какие вообще возможны замены? Есть много файлов, в каждой нужно.
Замена конца строки в файле
Привет всем. Есть база, где столбцы разделены символом табуляции (не пробел). Текст, который.
Замена строки в текстовом файле
Помогите пожалуйста Необходимо написать батник. Находит текст в файле 1.txt. Он может меняться.
Замена строки в файле реестра
Всем, привет. Не силен в деле написания cmd-файлов. Требуется помощь знающих людей. Есть.
замена погоды на корову осуществляется текстовым редактором vim по причине природной естественности данного процесса
Почему без /n и * он не выводит пустую строку.А если прописать после точки *,то все сразу все работает?
точка означает Искать любой символ-это понятно.
А как звездочка и /n влияет на поиск?
Ну и тогда еще вместо : можно поставить просто точку.Тоже работает.В обще не понимаю откуда это двоиточее взялось.Обьясните пожалуйста с поисковой строкой,а то я эти символы в регулярных выражениях, до конца не понимаю.
Согласен с вами.
Добавлено через 2 минуты
использует какую-то неведомую для меня логику. С двоеточием всё понятно: это просто экранирование строки.
Это понятно.Не понятно только то почему надо ставить звёздочку,что бы вывелась пустая строка.Ечли пустая строка это символ(Символ пустой строки),то точки достаточно ведь.Ведь если ставить точку,то выводится вся строка в которой есть любой существующий символ в начале строки.Зачем ставить звёздочку.
Не найдет ничего, вернет errorlevel==1 (совпадений нет) , потому что точка без квантификатора это ровно один любой символ, кроме символа новой строки. А кроме него в строке и нет ничего.
Чтобы точка соответствовала и символу новой строки в рег. выражениях нужно включать режим singleline.
findstr этого не умеет. Хотя, сам символ новой строки матчить может - при помощи хака описанного на stackoverflow.
Не найдет (формально) ничего, но вернет errorlevel==0 (совпадение есть), потому что * - это квантификатор означающий повтор символа 0, либо более раз . В данном случае - 0 найденных символов это тоже совпадение.
Народ, помогите с батником. Начал учиться писать .bat для себя. В итоге столкнулся с необходимостью bat на работе. Ну вот как написать нужный мне не могу понять. В инете есть похожие статьи, но не совсем то, что нужно мне.
Смысл батника таков:
Есть файл: К0000.*** (Первая часть К0000 остается неизменной, а вот .*** меняется).
Мне нужно сл.: чтоб он находил файл в директории, открывал его и заменял в тексте значения.
Допустим текст такой:
342342532532542542 А0 3423523523523523
231434213413413421 А1 234232342 А0 32423423423423
После обработки батником текст должен быть сл.
342342532532542542 00 3423523523523523
231434213413413421 00 234232342 00 32423423423423
т.е. среди множества цифр есть А1 и А0, он должен при совпадении А1 или А0 менять их на 00.
Второе условие, что он их должен менять только при полном совпадении, т.е. 123456789А9 - не подходит, 123456789А0 - подходит.
Просьба, Вы можете полностью описать процесс? Очень хотелось бы понять на примере, чтоб дальше писать самому.
Поиск и замена текста в файле
Имеется, допустим, файлик в кодировке 1251: tyutuyt бухгалтера лросодло клиентов апорпвоыпоп.
Замена текста в тхт файле
Добрый день! Помогите отредактировать файл. Есть текстовик c 100500 строками, нужно в каждой строке.
Замена текста в файле реестра
Такой вопрос. Как сделать батник, который будет изменять путь реестра, в который требуется сделать.
Извлечение подстроки с середины строки
echo.Date : %date% echo.Weekday: %date:~0,3% echo.Month : %date:~4,2% echo.Day : %date:~7,2% echo.Year : %date:~10,4%
Удаление всех пробелов в строке
Как вариант предыдущего примера
Вычисление длины строковой переменной
В 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%
Извлечение значения из файла конфигурации
В файле конфигурации git текущего пользователя ищем значение editor = , обрезаем знак = , извлекаем второй столбец и удаляем все пробелы вокруг.
ЗАМЕНА ОДНОЙ ПОДСТРОКИ НА ДРУГУЮ В ФАЙЛЕ
В результате, в папке, где будет запущен приведенный выше текст, создастся файл 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
Извлечение IP-адресов из файла журнала
Давайте разберем, что делает этот конвейер. Во-первых, как выглядит строка в журнале.
Затем awk '< print $12 >' извлекает из строки IP-адрес.
Команда sed 's@/@@' удаляет начальный слэш.
Примечание. Как мы уже видели ранее, в sed можно использовать любой разделитель. Хотя обычно в качестве разделителя используется / , здесь мы заменяем именно этот символ, что слегка ухудшит читаемость выражения подстановки.
sort | uniq -c сортирует IP-адреса в лексикографическом порядке, а затем удаляет дубликаты, добавляя перед IP-адресами количество вхождений каждого.
sort -rn | head -n 10 сортирует строки по количеству вхождений, численно и в обратном порядке, чтобы главные нарушители выводились в первую очередь, из которых отображаются 10 строк. Последняя команда awk < print $2 >извлекает сами IP-адреса.
Извлечение подстроки с начала строки
Замена подстроки в строке
set str=Я тебя раскусил, ты оборотень: то как человек, то как баран set str=%str:то=иногда% echo %str%
Решение
Работает идеально)
А можно Вас попросить описать процесс? За что отвечает каждая из?
А как сделать, чтоб он перезаписывал файл? Чтоб не создавалось нового .txt документа?
Возможно чтоб он искал сам в этой папке файл допустим M1234.***? Есть есть файл M1234. то он сам его берет, там из-за расширения только номер меняется. М1234 не меняется.
Буду очень благодарен если полностью опишите процесс, чтоб понимать что и к чему.Так проще учиться. Большое Вам спасибо!
это и происходит или я вас не понимаю.
200% на то что после этого ничего не поймете, если бы так быстро все давалось все были бы программистами давно и форум был бы не нужен.
Здесь представлен фрагмент будущей книги «Основные инструменты и практики для начинающего разработчика программного обеспечения» Бальтазара Рубероля и Этьена Броду. Книга должна помочь образованию подрастающего поколения разработчиков. Она охватит такие темы, как освоение консоли, настройка и эффективная работа в командной оболочке, управление версиями кода с помощью git , основы SQL, инструменты вроде Make , jq и регулярные выражения, основы сетевого взаимодействия, а также лучшие практики разработки программного обеспечения и совместной работы. В настоящее время авторы упорно работают над этим проектом и приглашают всех поучаствовать в списке рассылки.
Одна из причин, которые делают командную оболочку бесценным инструментом, — это большое количество команд обработки текста и возможность легко объединять их в конвейер, создавая сложные шаблоны обработки. Эти команды делают тривиальными многие задачи по анализу текста и данных, преобразованию данных между разными форматами, по фильтрации строк и т. д.
При работе с текстовыми данными главный принцип заключается в том, чтобы разбить любую сложную проблему на множество более мелких — и решить каждую из них с помощью специализированного инструмента.
Примеры из этой главы на первый взгляд могут показаться немного надуманными, но это сделано специально. Каждый из инструментов разработан для решения одной небольшой задачи. Однако в сочетании они становятся чрезвычайно мощными.
Мы рассмотрим некоторые из наиболее распространенных и полезных команд обработки текста в командной оболочке и продемонстрируем реальные рабочие процессы, соединяющие их вместе. Я предлагаю взглянуть на маны этих команд, чтобы увидеть всю широту возможностей в вашем распоряжении.
Команда cat используется для составления списка из одного или нескольких файлов и отображения их содержимого на экране.
head выводит первые n строк в файле. Это может быть очень полезно для того, чтобы заглянуть в файл неизвестной структуры и формата, не заваливая всю консоль кучей текста.
Если -n не указано, head выводит первые десять строк указанного файла или входящего потока.
tail — аналог head , только он выводит последние n строк в файле.
Если хотите вывести все строки, расположенном после n-й строки (включая её), можете использовать аргумент -n +n .
В нашем файле 43 строки, поэтому tail -n +42 выводит только 42-ю и 43-ю строки из него.
Если параметр -n не указан, tail выведет последние десять строк в указанном файле или входном потоке.
tail -f или tail --follow отображают последние строки в файле и каждую новую строку по мере записи в файл. Это очень полезно для просмотра активности в реальном времени, например, что записывается в логи веб-сервера и т. д.
wc (word count) выводит количество символов ( -c ), слов ( -w ) или строк ( -l ) в указанном файле или потоке.
По умолчанию отображается всё вышеперечисленное.
Если текстовые данные передаются по конвейеру или перенаправлены в stdin , то отображается только счётчик.
grep — это швейцарский нож фильтрации строк по заданному шаблону.
Например, можем найти все вхождения слова mutex в файле.
grep может обрабатывать либо файлы, указанные в качестве аргументов, либо поток текста, переданный на его stdin . Таким образом, мы можем сцеплять несколько команд grep для дальнейшей фильтрации текста. В следующем примере мы фильтруем строки в нашем файле metadata.csv , чтобы найти строки, содержащие и mutex, и OS.
Рассмотрим некоторые опции grep и их поведение.
grep -v выполняет инвертное сопоставление: фильтрует строки, которые не соответствуют шаблону аргументов.
grep -i выполняет сопоставление без учёта регистра. В следующем примере grep -i os находит как OS, так и os.
grep -l выводит список файлов, содержащих совпадение.
Команда grep -c подсчитывает, сколько раз найден образец.
grep -r рекурсивно ищет файлы в текущем рабочем каталоге и всех его подкаталогах.
grep -w показывает только совпадающие целиком слова.
cut извлекает часть файла (или, как обычно, входного потока). Команда определяет разделитель полей (который разделяет столбцы) с помощью опции -d , а порядковые номера столбцов для извлечения с помощью опции -f .
Например, следующая команда извлекает первый столбец из последних пяти строк нашего CSV-файла.
Поскольку мы имеем дело с CSV, то столбцы разделяются запятой, а за извлечение первого столбца отвечает опция -f 1 .
Можно выбрать и первый, и второй столбцы, используя опцию -f 1,2 .
paste объединяет вместе два разных файла в один многоколоночный файл.
По умолчанию paste использует разделитель табуляции, но его можно изменить с помощью параметра -d .
Ещё один распространённый способ использования paste — объединение всех строк в потоке или файле с помощью заданного разделителя, используя комбинацию аргументов -s и -d .
Если в качестве входного файла указан параметр - , то вместо него будет считываться stdin .
Команда sort , собственно, сортирует данные (в указанном файле или входном потоке).
sort -r выполняет обратную сортировку.
sort -n сортирует поля по их арифметическому значению.
uniq обнаруживает и отфильтровывает соседние одинаковые строки в указанном файле или входном потоке.
Поскольку uniq отфильтровывает только соседние строки, в наших данных могут ещё остаться дубликаты. Чтобы отфильтровать все одинаковые строки из файла, нужно сначала отсортировать его содержимое.
uniq -c в начале каждой строки вставляет количество её вхождений.
uniq -u отображает только уникальные строки.
Примечание. uniq особенно полезен в сочетании с сортировкой, поскольку конвейер | sort | uniq позволяет удалить все дублирующиеся строки в файле или потоке.
awk — это чуть больше, чем просто инструмент обработки текста: на самом деле у него целый язык программирования. В чём awk действительно хорош — так это в разбиении файлов на столбцы, и делает это с особенным блеском, когда в файлах перемешаны пробелы и табы.
Как видим, столбцы разделены либо пробелами, либо табуляциями, и не всегда одинаковым количеством пробелов. cut здесь бесполезен, потому что работает только с одним символом-разделителем. Но awk легко разберётся с таким файлом.
awk '< print $n >' выводит n-й столбец в тексте.
Хотя awk способен на гораздо большее, выдача колонок составляет, наверное, 99% вариантов использования в моём личном случае.
tr расшифровывается как translate. Эта команда заменяет одни символы на другие. Она работает либо с символами, либо с классами символов, такими как строчные, печатные, пробелы, буквенно-цифровые и т. д.
На стандартных входных данных tr заменяет все вхождения на .
tr может переводить классы символов с помощью нотации [:class:] . Полный список доступных классов описан на справочной странице tr , но некоторые продемонстрируем здесь.
[:space:] представляет все типы пробелов, от простого пробела до табуляции или символа новой строки.
Все символы, похожие на пробелы, переведены в запятую. Обратите внимание, что символ % в конце выдачи означает отсутствие завершающей новой строки. Действительно, этот символ тоже переведён в запятую.
[:lower:] представляет все строчные символы, а [:upper:] — все прописные. Таким образом, преобразование между ними становится тривиальным.
tr -c SET1 SET2 преобразует любой символ, не входящий в набор SET1, в символы набора SET2. В следующем примере все символы, кроме указанных гласных, заменяются пробелами.
tr -d удаляет указанные символы, а не заменяет их. Это эквивалент tr '' .
tr также может заменить диапазоны символов, например, все буквы между a и e или все числа между 1 и 8, используя нотацию s-e , где s — начальный символ, а e — конечный.
Команда tr -s string1 сжимает все множественные вхождения символов в string1 в одно-единственное. Одним из наиболее полезных применений tr -s является замена нескольких последовательных пробелов одним.
Команда fold сворачивает все входные строки до заданной ширины. Например, может быть полезно убедиться, что текст помещается на дисплеях небольшого размера. Так, fold -w n укладывает строки по ширине n символов.
Команда fold -s будет разбивать строки только на символах пробела. Её можно объединить с предыдущей, чтобы ограничить строким заданным количеством символом.
sed — это неинтерактивный потоковый редактор, который используется для преобразования текста во входном потоке строка за строкой. В качестве входных данных используется или файл, или stdin , а на выходе тоже или файл, или stdout .
Команды редактора могут включать один или несколько адресов, функцию и параметры. Таким образом, команды выглядят следующим образом:
Хотя sed выполняет множество функций, мы рассмотрим только замену текста как один из самых распространённых вариантов использования.
Удаление ведущих пробелов
set str= Не ждите чуда, чудите сами echo."%str%" for /f "tokens=* delims= " %%a in ("%str%") do set str=%%a echo."%str%"
Получение подстроки.
Если смещение начала подстроки и ее длина являются константами - здесь все достаточно просто и аналогичный пример рассматривался выше:
Прошу прощения, если в качестве значения переменной 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
Вывод на экран, в файл текста без перевода строки
В bat/cmd командах не предусмотрена возможность вывода данных без перевода строки. Но для решения такой задачи можно использовать некую уловку.
Команда set с параметром, предусматривающим ввод данных с экрана, позволяет вывести подсказку для ввода без перевода строки. Вот этим мы и воспользуемся.
Соответственно, для вывода текста в файл без перевода строки используется конструкция:
b.txt
Использование этого приема в сочетании с символом backspace (код 08) позволяет сделать вывод на экран изменяемого текста и как вариант - "вращающейся палки".
Конвертровать большие буквы в маленькие
: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
Фильтрация CSV с помощью grep и awk
В этом примере grep в файле metadata.csv сначала фильтрует строки, содержащие слово gauge , затем те, у которых query в четвёртой колонке, и выводит название метрики (1-я колонка) с соответствующим значением per_unit_name (5-я колонка).
Переименование функции в исходном файле
Представим, что мы работаем над проектом и хотели бы переименовать недачно названную функцию (или класс, переменную и т. д.) в исходном файле. Можно сделать это с помощью команды sed -i , которая выполняет замену прямо в оригинальном файле.
Однако мы переименовали функцию только в оригинальном файле. Это сломает импорт bool_from_str в любом другом файле, поскольку эта функция больше не определена. Нужно найти способ переименовать bool_from_str повсюду в нашем проекте. Такого можно добиться с помощью команд grep , sed , а также циклов for или с помощью xargs .
Чтобы заменить в нашем проекте все вхождения bool_from_str , сначала нужно рекурсивно найти их с помощью grep -r .
Поскольку нас интересуют только файлы c совпадениями, также необходимо использовать опцию -l/--files-with-matches :
Затем можем использовать команду xargs для осуществления действий с каждой строки выходных данных (то есть всех файлов, содержащих строку bool_from_str ).
Опция -n 1 указывает, что каждая строка в выходных данных должна выполнить отдельную команду sed .
Затем выполняются следующие команды:
Если команда, которую вы вызываете с помощью xargs (в нашем случае sed ), поддерживает несколько аргументов, то следует отбросить аргумент -n 1 для производительности.
Эта команда затем исполнит
Примечание. Из синопсиса sed на ман-странице видно, что команда может принять несколько аргументов.
Действительно, как мы видели в предыдущей главе, file . означает, что принимаются несколько аргументов, представляющих собой имена файлов.
Мы видим, что произведены замены для всех вхождений bool_from_str .
Как это часто бывает, существует несколько способов достижения одного и того же результата. Вместо xargs мы могли бы использовать циклы for , чтобы перебирать строки по списку и выполнять действие над каждым элементом. У этих циклов такой синтаксис:
Если обернуть нашу команду grep в $() , то оболочка выполнит её в подоболочке, результат чего затем будет повторён в цикле for .
Эта команда выполнит
Синтаксис циклов for кажется мне более чётким, чем у xargs , однако последняя может выполнять команды параллельно, используя параметры -P n , где n — максимальное количество параллельных команд, выполняемых одновременно, что может дать выигрыш в производительности.
Все эти инструменты открывают целый мир возможностей, так как позволяют извлекать и преобразовывать данные, создавая целые конвейеры из команд, которые, возможно, никогда не предназначались для совместной работы. Каждая из них выполняет относительно небольшую функцию (сортировка sort , объединение cat , фильтры grep , редактирование sed , вырезание cut и т. д.).
Любую задачу, включающую текст, можно свести к конвейеру более мелких задач, каждая из которых выполняет простое действие и передаёт свои выходные данные в следующую задачу.
Например, если нам хочется узнать, сколько уникальных IP-адресов в файле журнала, и чтобы эти IP-адреса всегда появлялись в одном и том же столбце, то можно запустить следующую последовательность команд:
- grep строк, которые соответствуют шаблону строк с IP-адресами
- найти столбец с IP-адресом, извлечь его с помощью awk
- отсортировать список IP-адресов с помощью sort
- устранить смежные дубликаты с помощью uniq
- подсчитать количество строк (то есть уникальных IP-адресов) с помощью wc -l
Примеры в этой статье были надуманными, но я предлагаю вам прочитать удивительную статью «Инструменты командной строки могут быть в 235 раз быстрее, чем ваш кластер Hadoop», чтобы получить представление о том, насколько полезны и мощны эти команды на самом деле и какие реальные проблемы они могут решить.
- Подсчитайте количество файлов и каталогов, расположенных в вашем домашнем каталоге.
- Отобразите содержимое файла только прописными буквами.
- Подсчитайте, сколько раз встречалось каждое слово в файле.
- Подсчитайте количество гласных в файле. Отсортируйте результат от наиболее распространённой до наименее распространённой буквы.
Если интересно поучаствовать в проекте, подписывайтесь на список рассылки!
Нужно внести в несколько файлов одно и то же значение, при этом удалив старые и заменив на новые. Но и в каждом файле нужное значение находится в разных строках, и в некоторых еще перед нужным значением есть другие, которые нужно оставить.
Простой 1 комментарий
В bat файле можно запустить любую внешнюю программу, например, sed какой-нибудь, который такую задачу замечательно решает, и вполне можно найти под win.
Также можно написать какой-то скрипт на python или php, или другом языке, и его запустить из bat. =)
Можно и голым батником, без сторонних средств, но с некоторыми ограничениями.
Но проще, как сказал Борис Сёмов использовать специально для этого предназначенные утилиты типа sed.
Luan, Вот реализация на голом BAT, без сторонних средств:
Правильно инициализируйте переменные:
filename - обрабатываемый файл
fileout - получаемый файл
findstr - строка поиска
replacestr - строка замены
На счет ограничений:
1.Во входном файле не должно содержаться спец.символов cmd.exe, а это целая пачка разных символов, например: !<>|&^ список не полный. Кроме спец.символов cmd.exe не любит всяких экзотических "не печатных" символов.
Если в строке будут содержаться спец.символы, то скорее всего батник завершиться ошибкой. Но может и просто не корректно отработать. Это зависит от символа.
2.Обработка файла производится построчно, разделитель строк стандартный для винды: CRLF. Юниксовый разделитель не прокатывает. Есть ограничение на длину одной строки, сходу не скажу какое именно - несколько килобайт.
3.Батник, скорее всего, будет проглатывать пустые строки или несколько подряд идущих пустых строк.
4.Если нужно менять русские символы, то кодировка обрабатываемого файла должна совпадать с кодировкой консоли. По умолчанию кодировка консоли cp866. Ее можно поменять на cp1251 с помощью команды chcp 1251. Команду можно добавить в батник второй строкой. Сам батник так же должен быть сохранен в "рабочей" кодировке. С UTF8 cmd.exe не дружит.
5.точно есть что-то еще.
PS: если вам для дела, то sed лучшее решение.
Luan, Вашу задачу без вышеперечисленных ограничений можно сделать на VBS или JS. Интерпретатор этих ЯП присутствует в винде из коробки: cscript.exe и wscript.exe
res2001, интерпретаторы (исполняющие ядра) этих языков — vbscript.dll и jscript.dll, а сами серверы сценариев (строго говоря, не единственно возможные) ничего о синтаксисе этих языков (тоже не единственно возможных) не знают.
wisgest, Я в курсе, но это не обязательно знать, чтоб начать писать и выполнять свои сценарии. Вряд ли ТС захочет расширять WSH своими реализациям исполняющих ядер.
А знание о том, как запустить скрипт из командной строки, полезно.
Объединение строк
Замена текста
Команда замены sed выглядит следующим образом:
Пример: замена первого экземпляра слова в каждой строке в файле:
Мы видим, что в первой строчке заменяется только первый экземпляр hello . Чтобы заменить все вхождения hello во всех строках, можно использовать опцию g (означает global).
sed позволяет использовать любые разделители, кроме / , что особенно улучшает читаемость, если в самих аргументах команды есть слэши.
Адрес говорит редактору, в какой строке или диапазоне строк выполнять подстановку.
Адрес 1 указывает заменять hello на Hey I just met you в первой строке. Можем указать диапазон адресов в нотации , , где может быть либо номером строки, либо $ , то есть последней строкой в файле.
По умолчанию sed выдаёт результат в свой stdout , но может отредактировать и оригинальный файл с опцией -i .
Примечание. В Linux достаточно только -i . Но в macOS поведение команды немного отличается, поэтому сразу после -i нужно добавить '' .
Удаление подстроки в строке
В данном примере из строки будет удалена подстрока "кожа "
Удаление первого и последнего символа в строке
(часто этот прием используют для удаления окаймляющих кавычек)
Вывод адреса IPv4, связанного с сетевым интерфейсом
Команда ifconfig выводит сведения по указанному сетевому интерфейсу. Например:
Затем запускаем grep для inet , что выдаст две строки соответствия.
Затем с помощью grep -v исключаем строку с ipv6 .
Наконец, с помощью awk запрашиваем второй столбец в этой строке: это IPv4-адрес, связанный с нашим сетевым интерфейсом en0 .
Примечание. Мне предложили заменить grep inet | grep -v inet6 такой надёжной командой awk :
Она короче и конкретно нацелена на IPv4 с условием $1 == "inet" .
Читайте также: