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

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

Ответить
Настройки темы
CMD/BAT - [решено] Удаление одной предыдущей строки

Аватара для Freddy1984

Старожил


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

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


Изменения
Автор: Freddy1984
Дата: 15-08-2019
Вложения
Тип файла: zip файл.zip
(512 байт, 7 просмотров)
Здравствуйте! Подскажите пожалуйста как на cmd или powershell реализовать следующее:

В текстовом файле имеем:

строка
строка
set REV=1.1
VER:1.10.50=(значение меняется)
строка
строка


Надо во всём txt файле найти и удалить одну предыдущую строку перед VER:1.10.50=(значение меняется)
То есть часть строки постоянна VER:1.10.50= и далее после знака ровно, значения меняются.

Другими словами, надо просто удалять одну предыдущую строку, что бы получилось:

строка
строка
VER:1.10.50=(значение меняется)
строка
строка

Отправлено: 12:59, 15-08-2019

 

Ветеран


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

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


YuS_2, а почему в первом шаблоне именно «[^\n]», а не просто «.», ведь точка и означает «Any except \n (new line)»? Это просто вопрос, ежели что.

Цитата Freddy1984:
в том то и дело что нет, в моём случае так не выйдет, так как SetREV= лишний ТОЛЬКО перед VER:1.10.50=
Во всех остальных случаях эти SetREV= не трогать. Так как в этом же текстовом файле есть и другие позиции, при которых должно быть присутствие SetREV= »
Выйдет. Причём искать следует именно строку, начинающуюся на SetREV=, находящуюся перед строкой, начинающейся на VER:<цифры>.<цифры>.<цифры>=.

Отправлено: 13:53, 16-08-2019 | #11



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

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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Iska:
а почему в первом шаблоне именно «[^\n]», а не просто «.», ведь точка и означает «Any except \n (new line)»? Это просто вопрос, ежели что. »
Т.к. текст содержит много строк, это более надежный шаблон для захвата одной строки... скажем так, это скорее привычка использовать именно такой вариант, т.к. в программах, которые использую (например, AkelPad), есть настройка поведения захвата символов точкой...
В принципе, можно и так:
Код: Выделить весь код
(gc 'цель.txt' -enc utf8 -raw) -replace '(?-s)SetREV.*\n(?=VER:1\.10\.50=)'|
out-file 'результат.txt' -enc utf8
- это эквивалент... так что, использование такой конструкции не принципиально.

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 17-08-2019 в 21:51.

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

Отправлено: 17:54, 16-08-2019 | #12


Аватара для Freddy1984

Старожил


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

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


Цитата Iska:
Выйдет. Причём искать следует именно строку, начинающуюся на SetREV=, находящуюся перед строкой, начинающейся на VER:<цифры>.<цифры>.<цифры »
ну, в общим то если искать строку именно перед VER:<цифры> и потом её (SetREV) удалять то это согласен, тоже верно.
Но это по факту всё тоже что я описал выше, только вид сбоку

Отправлено: 09:33, 17-08-2019 | #13


Ветеран


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

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


YuS_2, спасибо, Ваша мысль понятна. Только точки я бы-таки заэкранировал.

Цитата Freddy1984:
ну, в общим то если искать строку именно перед VER:<цифры> и потом её (SetREV) удалять то это согласен, тоже верно. »
Не «тоже верно», а именно так надо делать, и именно так и было сделано. В противном случае при повторном запуске кода мы получим удаление совсем не того, что требовалось.
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:29, 17-08-2019 | #14


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Iska:
Только точки я бы-таки заэкранировал. »
однозначно! это всё моя спешка помноженная на невнимательность...
исправлено.

-------
scio me nihil scire. Ѫ


Отправлено: 21:50, 17-08-2019 | #15


Аватара для Freddy1984

Старожил


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

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


Можно ещё вопрос?
Подскажите пожалуйста как сделать дозапись предыдущей строки?
Вроде логично что вместо replace должен быть write. Но что то не выходит..
То есть имеется:
строка
строка
set REV=1.1
VER:1.10.50=(значение меняется)
строка
строка


Если "set REV=1.1" имеется перед "VER:1.10.50=", то пропускаем, а если "set REV=1.1" перед "VER:1.10.50=" отсутствует, то перед "VER:1.10.50=" дописать "set NEW.REV=5.5"

То есть перед дозаписью возможно как то организовать проверку наличия конкретной предыдущей строки? И если строка отсутствует, до дописать своё.

Отправлено: 11:19, 26-08-2019 | #16


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Freddy1984:
Вроде логично что вместо replace должен быть write. »
может и логично, но неправильно
Нет такого оператора в данном контексте...
А код будет примерно таким:
Код: Выделить весь код
$var = 'Set NEW.REV=5.5'
(gc 'цель.txt' -enc utf8 -raw) -replace '(?<!set rev\=1\.1[^\n]*\n)(ver:1\.10\.50=)',"$var`n`$1" |
out-file 'результат.txt' -enc utf8

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 26-08-2019 в 20:14.

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

Отправлено: 20:04, 26-08-2019 | #17


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Freddy1984:
думал что скрипт эти записи будет пропускать »
с чего бы вдруг?
Условие было таким:
Цитата Freddy1984:
Если "set REV=1.1" имеется перед "VER:1.10.50=", то пропускаем »
Соответственно, именно так и работает шаблон регулярного выражения, т.е. если перед строкой "VER:1.10.50=" нет строки, содержащей текст "set REV=1.1", то будет добавлена строка, записанная в переменную $var

-------
scio me nihil scire. Ѫ


Отправлено: 10:46, 27-08-2019 | #18


Аватара для Freddy1984

Старожил


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

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


Цитата YuS_2:
с чего бы вдруг? »
да, я разобрался, кое что упустил, прошу прощения
Можно тогда ещё один вопрос в догонку?
У меня после "$var`n`$1" в строку идёт ещё один replace, но в консоли пишет "Отсутствует выражение после ","
То есть ругается на то что после запятой идут кавычки как я понял. А эти кавычки можно как то заэкранировать? Просто пробовал по разному, но что то не выходит.. Что то типа '"$var`n`$1"'
Запускаю в пакетнике через powershell -c

Последний раз редактировалось Freddy1984, 27-08-2019 в 11:23.


Отправлено: 11:15, 27-08-2019 | #19


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Freddy1984:
Запускаю в пакетнике через powershell -c »
запускайте пакетником скрипт
Код: Выделить весь код
powershell -f '.\script.ps1'
меньше будет проблем

-------
scio me nihil scire. Ѫ


Отправлено: 12:20, 27-08-2019 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
phpQuery парсер одной строки заголовка Dark_Delphin Вебмастеру 1 06-10-2018 15:16
Сделать элементы списка одной высоты в пределах каждой строки Мамелюк Вебмастеру 0 25-11-2015 19:17
MSFT SQL Server - Как перенести строки из одной базы в другую sql server 2008 r2 Order Программирование и базы данных 4 04-02-2015 11:00
[решено] Разбить данные одной строки по полям формы support23 AutoIt 5 19-09-2012 15:18
CMD/BAT - Поиск слова в тексте, удаление строки, удаление 8 строк выше и 3 строк ниже Alk-13 Скриптовые языки администрирования Windows 0 10-02-2012 18:06




 
Переход