Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Замена строк в файле по признаку и маске

Ответить
Настройки темы
CMD/BAT - Замена строк в файле по признаку и маске

Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день!

Есть файл с содержимым вида:

61400013.68F
61400013.69F
61400013.70F
61400013.71F
61400048.51F
61400048.52F
61400070.16F
61400070.17F
61400070.18F
61400070.19F
61400215.23F
61400215.24F
61400215.25F

Если не смотреть на точки и букву F, то видно, что это просто увеличивающиеся числа,
но они как бы разбиты на диапазоны роста

1
61400013.68F
61400013.69F
61400013.70F
61400013.71F

2
61400048.51F
61400048.52F

3
61400070.16F
61400070.17F
61400070.18F
61400070.19F

4
61400215.23F
61400215.24F
61400215.25F

В каждой строке всегда присутствует точка и буква F

Суть проблемы:

Надо в каждом диапазоне заменить все строки, КРОМЕ последней на вид:

[задаваемая маска]61400013.68F
[задаваемая маска]61400013.69F
[задаваемая маска]61400013.70F
[задаваемая маска два]61400013.71F[задаваемая маска три]

таким образом:
исходное состояние:

61400013.68F
61400013.69F
61400013.70F
61400013.71F
61400048.51F
61400048.52F
61400070.16F
61400070.17F
61400070.18F
61400070.19F
61400215.23F
61400215.24F
61400215.25F

конечное состояние:

[задаваемая маска]61400013.68F
[задаваемая маска]61400013.69F
[задаваемая маска]61400013.70F
[задаваемая маска два]61400013.71F[задаваемая маска три]

[задаваемая маска]61400048.51F
[задаваемая маска два]61400048.52F[задаваемая маска три]

[задаваемая маска]61400070.16F
[задаваемая маска]61400070.17F
[задаваемая маска]61400070.18F
[задаваемая маска два]61400070.19F[задаваемая маска три]

[задаваемая маска]61400215.23F
[задаваемая маска]61400215.24F
[задаваемая маска два]61400215.25F[задаваемая маска три]

Очень прошу помощи!!!

Отправлено: 07:04, 12-09-2015

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Может ли быть «диапазон» такого вида:
Код: Выделить весь код
61400013.97F
61400013.98F
61400013.99F
61400014.00F
61400014.01F
61400014.02F
?

Отправлено: 08:38, 12-09-2015 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


Да, это считается диапазоном одного типа.

Переход на другой диапазон происходит при разрыве в счете больше заданной пользователем величины.

Т.е. два диапазона будут выглядеть так:

задается разрыв = 5 и

61400013.97F
61400013.98F
61400013.99F
61400014.00F
61400014.01F

61400014.06F
61400014.07F
61400014.08F

Приведен пример двух диапазонов.

Отправлено: 10:00, 12-09-2015 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Количество цифр до точки — всегда строго равно восьми символам? А после точки — строго двум и одной букве?

Отправлено: 11:29, 12-09-2015 | #4


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


ВиталийВ, Powershell устроит?
Код: Выделить весь код
$mask1 = '[mask1]'
$mask2 = '[mask2]'
$mask3 = '[mask3]'

get-content 'C:\file.txt' | group {$_.split('.')[0]} | foreach {

	$group = $_.group
	$group[0..($group.count-2)] | foreach { $mask1 + $_ }
	$mask2 + $group[-1] + $mask3

} | set-content 'C:\file.txt'
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:34, 12-09-2015 | #5


Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


Да, формат строк - неизменен.

Приведенный пример у меня не сработал, файл не изменился.

Отправлено: 11:48, 12-09-2015 | #6


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


У меня сработал, кроме одного — в результирующем файле отсутствуют первоначальные значения между «[mask2]» и «[mask3]» . Т.е, на исходном примере выходит (PowerShell 2.0):
Скрытый текст
Код: Выделить весь код
[mask1]61400013.68F
[mask1]61400013.69F
[mask1]61400013.70F
[mask2][mask3]
[mask1]61400048.51F
[mask2][mask3]
[mask1]61400070.16F
[mask1]61400070.17F
[mask1]61400070.18F
[mask2][mask3]
[mask1]61400215.23F
[mask1]61400215.24F
[mask2][mask3]


ВиталийВ, коли у Вас так — выкладывайте Ваш файл, упаковав его в архив (прикрепив последний к сообщению, либо выложив на RGhost). И последний вопрос — к какому случаю следует относить «диапазон» из одной строки — к «маска1» или «маска2+маска3»?

Отправлено: 12:34, 12-09-2015 | #7


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Цитата Iska:
У меня сработал, кроме одного — в результирующем файле отсутствуют первоначальные значения между «[mask2]» и «[mask3]» »
Попробовал с эмуляцией второй версии:
Код: Выделить весь код
start-process powershell -arg "-version 2.0"
Не видит $group[-1], значит надо заменить на $group[$group.count-1]
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:06, 12-09-2015 | #8


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Foreigner, с указанным изменением отработало корректно. Ждём теперь архив с файлом от автора (хотя не представляю навскидку, что там может не работать).

Отправлено: 13:24, 12-09-2015 | #9


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


Код пакетного файла:


Код: Выделить весь код
@echo off
setlocal

set "file=C:\Test\example.txt"

set "text_1=[задаваемая маска]"
set "text_2=[задаваемая маска два]"
set "text_3=[задаваемая маска три]"

for /f %%i in ('"type "%file%"& del "%file%""') do (
 set x=%%i
 call set x=%%x:~1,-1%%
 call set x=%%x:.=%%
 set/a y+=1
 for /f "tokens=1,2 delims=*" %%j in ('
  "set/a x& <nul set/p=*& set/a y"
 ') do (
  if defined z (
   if %%j equ %%k (
    call set "string=%text_1%%%z%%"
   ) else (
    call set "string=%text_2%%%z%%%text_3%"
    set blank=true
   )
  )
 )
 >>"%file%" (
 if defined string cmd/v/c echo !string!
 if defined blank echo.& set blank=
 )
 set/a y=x
 set z=%%i
)
>>"%file%" cmd/v/c echo !text_2!%z%!text_3!

endlocal
exit/b

.

Последний раз редактировалось Georgio, 12-09-2015 в 19:42.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:20, 12-09-2015 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Замена строк в файле по признаку и маске

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Поиск, удаление, замена и добавление строк в текстового файле. Что возможно? akrav Скриптовые языки администрирования Windows 8 06-12-2015 13:22
CMD/BAT - [решено] Замена строк в файле, содержащем пустые строки SharkyEXE Скриптовые языки администрирования Windows 6 02-03-2015 15:42
CMD/BAT - Поиск строк в файле и замена их на числа,сгенерированные по маске. galclerik Скриптовые языки администрирования Windows 17 19-12-2013 11:59
VBS/WSH/JS - [решено] Поиск строки по маске в txt файле и замена всей строки из InputBox ultrarare Скриптовые языки администрирования Windows 11 03-07-2013 14:37
CMD/BAT - Замена нескольких строк в файле bcubbs@fb Скриптовые языки администрирования Windows 3 24-01-2013 14:01




 
Переход