С Новым годом! Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 17.02.2013
Сообщений: 52
1

Замена текста в n-ой строке и k-ой подстроке

08.03.2019, 09:12. Показов 1031. Ответов 8

Author24 — интернет-сервис помощи студентам
Здравствуйте, есть файлик такого типа:

0;?Is=0;!Is=4;Int=00:01:01;i0=-1,s0=9;i1.....
0;?Is=0;!Is=4;Int=00:01:01;i0=-1,s0=10.....
0;?Is=0;!Is=4;Int=00:02:01;i0=-1,s0=11....
0;?Is=0;!Is=4;Int=00:01:01;i0=-1,s0=12....
0;?Is=0;!Is=4;Int=01:06:01;i0=-1,s0=13....
....
....
....

Он состоит из 20 строк, необходимо с помощью батника заменять в 10-й строке:

0;?Is=0;!Is=4;Int=01:06:01;i0=-1,s0=13....

Только время "01:06:01" на вводимое пользователем (время в этой строке всегда разное, поскольку файл должен обновляться).

Получилось написать такой код:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@echo off
 
Set /p A="Hours: "
Set /p B="Minutes: "
Set /p C="Seconds: "
 
Set D=:
call :sub1 "file.txt" 10
 
exit/b
 
:sub1
 set "f=%~1"& setlocal enabledelayedexpansion
 for /f %%i in ('^<"!f!" find/c /v ""') do <"!f!">.tmp (for /l %%j in (1 1 %%i) do @(
  set x=& set/p x=& if defined x (if "%%j" equ "%~2" (echo.!A!!D!!B!!D!!C!) else echo.!x!) else echo.)
 )& >nul move .tmp "!f!"
 endlocal& exit/b
Данный код находит 10-ю строку, чистит и записывает в нее введенные значения. Вопрос в том как сделать чтобы редактировать только время в строке?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2019, 09:12
Ответы с готовыми решениями:

Замена картинки по подстроке
Подскажите пожалуйста, почему не работает !? Надо по наличию слова в подстроке ставить ту или иную...

Замена пробелов в подстроке
Мне нужно написать функцию которая будет находить и заменять обычный пробел на нижний, не совсем...

Замена строки в подстроке на новую строку
Все доброго времени суток. Я написал программу, которая в строке S ищет подстроку S1 и заменяет ее...

Замена текста в строке
Есть файл с заменами (что на что заменить) и есть файл, в котором нужно менять, почему не...

8
Покинул форум
3672 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
08.03.2019, 11:49 2
Самый простой способ - взять sed:
Windows Batch file
1
sed -i "10s/\(..:..:..\)/16:40:57/" file.txt
Проблема в том, как вы собираетесь проверять корректность времени? Укажет пользователь 523:41390:801 и что тогда? Лучше задумайтесь над использованием PowerShell.
0
1 / 1 / 0
Регистрация: 17.02.2013
Сообщений: 52
08.03.2019, 17:46  [ТС] 3
Можете подсказать, как мне встроить этот код с sed? Просто я не совсем разбираюсь, что да как
0
Покинул форум
3672 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
08.03.2019, 18:43 4
Sed можно взять здесь (по крайней мере без каких-либо posix зависимостей), помещаете бинарник в одну из папок переменной PATH и пишите командный сценарий примерно следующего содержания:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@echo off
  setlocal enabledelayedexpansion
    rem просим ввести пользователя время
    set /p "tm=Enter time: "
    set "i=0" % rem : счетчик
    for %%i in ("%tm::=";"%") do (
      2>nul set /a "arr.!i!=%%~i"
      set /a "i+=1"
    )
    rem простая проверка на корректность указанного значения
    for /l %%i in (0, 1, 2) do (
      if !arr.%%i! lss 0 (
        echo:Invalid value.
        goto:eof
      )
    )
    for /l %%i in (1, 1, 2) do (
      if !arr.%%i! gtr 59 (
        echo:Invalid value.
        goto:eof
      )
    )
    if !arr.0! geq 24 (
      echo:Invalid value.
      goto:eof
    )
    rem file.txt изменить на имя файла, который нужно изменить
    rem лучше указывать с полным путем в кавычках
    sed -i "10s/\(..:..:..\)/!tm!/" file.txt
  endlocal
exit /b
0
6260 / 2134 / 337
Регистрация: 10.12.2013
Сообщений: 7,366
08.03.2019, 21:00 5
Поменяет время в 10-ой строке файла file.txt на значение из системного буфера обмена(System clipboard) :
newtime.bat
Windows Batch file
1
@vim +10s/..:..:../\=@* +x file.txt
vim - текстовый редактор.

установка vim:
Windows Batch file
1
@choco install vim
choco - установщик программного обеспечения из репозитория Windows

установка choco:
Windows Batch file
1
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
требования к системе для установки choco:
  • Windows 7+ / Windows Server 2003+
  • PowerShell v2+
  • .NET Framework 4+ (процесс установки попробует сам установить .NET 4.0, если последний не установлен)

Добавлено через 6 минут
greg zakharov, твой ход

Добавлено через 18 минут
Поясню, почему из буфера обмена:

процесс валидации значения времени возлагается на Excel-евскую ячейку,
затем <Ctrl-C> и вперёд.

Ну выпил я коньяка, ну и что !?! Праздник же.
0
Покинул форум
3672 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
08.03.2019, 21:19 6
volodin661:
PowerShell
1
2
$a[9] = ($a = gc .\file.txt)[9] -replace '..:..:..', [DateTime]::Now.ToLongTimeString()
Out-File .\file -Inp $a
Но это для pwsh. Есть варианты с Perl, Ruby, SQLite, Julia, Tcl, Python, но это уже совсем офтоп. И потом нас итак уже считают здесь фриками по разуму, так что...
0
1 / 1 / 0
Регистрация: 17.02.2013
Сообщений: 52
09.03.2019, 08:13  [ТС] 7
Вы, конечно, классные чуваки) но я теперь совсем ничего не понимаю
А можно ли без sed, vim, choco и прочего найти в файле подстроку "01:06:01" и заменить ее на введенные значения пользователем?
Подстрока "01:06:01" всегда находится на 10-й строке и имеет перед собой 18 символов. Можно ли исходя из этих параметров что-то смастерить?
0
1 / 1 / 0
Регистрация: 17.02.2013
Сообщений: 52
11.03.2019, 14:06  [ТС] 8
greg zakharov, разобрался я с установкой sed, запустил ваш код - все работает, только он еще и меняет структура файла - т.е. теперь весь файл это одна длинная строка. Как это исправить?
0
1 / 1 / 0
Регистрация: 17.02.2013
Сообщений: 52
16.03.2019, 05:58  [ТС] 9
Все разобрался)) всем спасибо
0
16.03.2019, 05:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.03.2019, 05:58
Помогаю со студенческими работами здесь

Замена текста в строке
Как можно в файле найти определенный ключ и заменить его значение (в &quot;&quot;) на новое? Например:...

Замена текста в строке
Не могу понять как реализовать Replace не подойдет Допустим, у меня есть строка &quot;This was...

Однократная замена текста в строке по индексу
Есть строка (получена из файла). Необходимо найти текст от определенного индекса необходимой длины...

Clojure Замена гласных букв в строке текста
Дана строка текста. Определить функцию, которая возвращает копию этой строки, в которой все гласные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru