400 / 315 / 40
Регистрация: 30.01.2015
Сообщений: 1,364
1

Поиск и копирование текста "от и до" из файла по заданным значениям

24.11.2022, 16:13. Показов 420. Ответов 11
Метки нет (Все метки)

Помогите с реализацией следующей задачи.
Требуется в файле найти и скопировать все строки начиная с -----BEGIN CERTIFICATE----- и заканчивая -----END CERTIFICATE----- (включая эти строки)
Обычно это всегда находится в конце файла. Но заканчивается пустой строкой (ее не надо копировать).

Если воспользоваться таким кодом:
Windows Batch file
1
2
3
4
5
6
7
8
9
@echo off
set "file=admin.crt"
set "search=-----BEGIN CERTIFICATE-----"
set "header_line="
for /f "tokens=1  delims=[]" %%a in ('find /i /n "%search%" "%file%" ') do set "header_line=%%a"
if defined header_line (
  more +%header_line% "%file%">>test.txt
)
pause
То не копируется начальная строка -----BEGIN CERTIFICATE----- и соответственно последняя пустая строка тоже будет скопирована. Можно конечно в код добавить добавление первой строки
Windows Batch file
1
echo -----BEGIN CERTIFICATE----->>test.txt
и после воспользоваться кодом на удаление.

Но может есть более простое решение?

Добавлено через 18 минут
С первой задачей справился исправлением строки на:
Windows Batch file
1
for /f "tokens=1  delims=[]" %%a in ('find /i /n "%search%" "%file%" ') do set /a "header_line=%%a-1"
Но хотелось бы найти решение, если всё же не последние строки надо копировать, а от и до.

Добавлено через 2 минуты
Например, найти номер начальной строки, найти номер конечной строки и через цикл копировать все эти строки?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.11.2022, 16:13
Ответы с готовыми решениями:

Поиск и копирование текста из "value"
Доброго времени суток, нужно что бы cmd (bat) мог искать в текстовом файле значенние (value) по...

Перевод текста в HEX-код (+ скроллигн клавишами "Вверх","Вниз","PageUp","PageDown")
Uses Crt; Var Buf: Array of Byte; Scr: Array of Byte absolute $B800:0; Sz:...

В каждом слове текста замените "а" на букву "е", если "а" стоит на четном месте, и заменить букву "б" на сочетание "ак",
В каждом слове текста замените "а" на букву "е", если "а" стоит на четном месте, и заменить букву...

Даны текстовый файл "F" и строка "S". Получить все строки файла "F", содержащие в качестве фрагмента строку "S".
Плиз помогите написать прогу: Даны текстовый файл "F" и строка "S". Получить все строки файла "F",...

В каждой строке текстового файла заменить последовательность слов "один", "два", "три" на "1-2-3"
Задание:В каждой строке заменить последовательность слов "один", "два", "три" на "1-2-3". ...

11
5276 / 1665 / 289
Регистрация: 10.12.2013
Сообщений: 5,872
24.11.2022, 16:35 2
при установленном редакторе vim
Windows Batch file
1
vim -es +/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/ +q admin.crt
кроме того,
при имеющейся на борту утилите exiftool, можно использовать её возможности

файл GETSERT
Ruby
1
2
3
4
while(<>) {
    print if /-----BEGIN CERTIFICATE-----/../-----END CERTIFICATE-----/
}
exit
Windows Batch file
1
exiftool -config GETSERT admin.crt
0
400 / 315 / 40
Регистрация: 30.01.2015
Сообщений: 1,364
24.11.2022, 16:43  [ТС] 3
volodin661, vim это сторонняя программа? гуглится как текстовый редактор. Без использования сторонних програм желательно реализовать задачу

Добавлено через 6 минут

Не по теме:

задача у меня в целом стоит в написании единого универсального скрипта для OpenVPN (пока для версий 2.4.х) под windоws. Чтобы из него все необходимые действия можно было совершить включая создание единого клиентского файла *.ovpn со всеми сертификатами внутри, а не отдельными файлами

0
5276 / 1665 / 289
Регистрация: 10.12.2013
Сообщений: 5,872
24.11.2022, 17:01 4
Цитата Сообщение от V1RTuE Посмотреть сообщение
адача у меня в целом стоит в написании единого универсального скрипта для OpenVPN
ну так и используй нормальные инструменты для создания скрипта.
python, powershell etc

если ты обратил внимание на те 2 мои примера, то данная твоя задача при использовании норм. инструмента решается не сложнее, чем формулируется: ты указываешь диапазон + команда 'print', на выходе получаешь желаемое.
0
5239 / 2446 / 969
Регистрация: 06.06.2017
Сообщений: 8,359
24.11.2022, 17:56 5
V1RTuE, в .crt может быть сколько угодно таких блоков. Куда и как их выносить по итогу?
0
400 / 315 / 40
Регистрация: 30.01.2015
Сообщений: 1,364
24.11.2022, 18:04  [ТС] 6
Цитата Сообщение от FlasherX Посмотреть сообщение
V1RTuE, в .crt может быть сколько угодно таких блоков. Куда и как их выносить по итогу?
в моем случае всегда один блок. просто требуется по ключевым словам до первого совпадения найти и скопировать строки между ними.
0
5239 / 2446 / 969
Регистрация: 06.06.2017
Сообщений: 8,359
24.11.2022, 18:19 7
Тогда такой .vbs:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Option Explicit
Const sFile = "admin.crt", tFile = "text.txt"
'————————————————————————————————————————————
Dim oFSO, oCrt, Str, Check, Text
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oCrt = oFSO.OpenTextFile(sFile)
Do: Str = oCrt.ReadLine
    If Str = "-----BEGIN CERTIFICATE-----" Then Check = 1
    If Check Then Text = Text & vbCrLf & Str
Loop Until Str = "-----END CERTIFICATE-----": oCrt.Close
With oFSO.CreateTextFile(tFile, 1)
   .Write Mid(Text, 3): .Close
End With
Set oCrt = Nothing: Set oFSO = Nothing
0
2110 / 947 / 435
Регистрация: 29.05.2016
Сообщений: 4,125
24.11.2022, 18:40 8
V1RTuE, пробуйте:
Windows Batch file
1
2
3
4
5
@echo off
set "file=admin.crt"
powershell -executionpolicy bypass -command "$array=Get-Content '%file%'; $start=[array]::IndexOf($array, '-----BEGIN CERTIFICATE-----'); $end=[array]::IndexOf($array, '-----END CERTIFICATE-----'); $array[$start..$end] | out-file 'test.txt'"
pause
exit
0
400 / 315 / 40
Регистрация: 30.01.2015
Сообщений: 1,364
24.11.2022, 21:02  [ТС] 9
Без powershell и vbs получился вот такой у меня вариант:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
set filein=admin.crt
set fileout=test.txt
for /f "delims=[] tokens=1*" %%a in ('find /i /n "-----BEGIN CERTIFICATE-----" ^< "%filein%"') do set beginstr=%%a
for /f "delims=[] tokens=1*" %%a in ('find /i /n "-----END CERTIFICATE-----" ^< "%filein%"') do set endstr=%%a
set /a str=%endstr%-%beginstr%
 
(SetLocal EnableDelayedExpansion
 set/a $ai=-1
 for /f "usebackq delims=" %%a in ("%filein%") do @(set "$a=%%a"
 if "!$a:~,28!"=="-----BEGIN CERTIFICATE-----" set/a $ai=%str%
 if !$ai! geq 0 set/a $ai-=1& echo:!$a!)
EndLocal)>"%fileout%"
Правда не совсем понял последние строки как они работают

Добавлено через 2 часа 4 минуты
Цитата Сообщение от Karen87 Посмотреть сообщение
set "file=admin.crt"
Вопрос немного не по теме, но в каких случаях требуется брать в кавычки "file=admin.crt"? Без них же точно так же команда отработает
0
2110 / 947 / 435
Регистрация: 29.05.2016
Сообщений: 4,125
24.11.2022, 21:07 10
Исключает проблемы при наличии пробелов
0
1020 / 277 / 127
Регистрация: 26.03.2022
Сообщений: 522
25.11.2022, 00:00 11
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
@Echo Off
    Set "FileIn=Z:\Box_In\Требуется в файле.txt"
    Set "FileOut=Z:\Box_In\найти и скопировать.txt"
 
    Set "Key1=-----BEGIN CERTIFICATE-----"
    Set "Key2=-----END CERTIFICATE-----"
 
    FOR /F "usebackq skip=2 tokens=1 delims=[]" %%i In (`Find /N /I "%Key1%" "%FileIn%"`) DO Set /A N=%%i-1
 
    >"%FileOut%" (FOR /F "usebackq delims=" %%i In (`More +%N% "%FileIn%"`) DO (
        Echo %%i|Find /I /V "%Key2%"||(<nul Set /P Str=%%i&Exit /B 0)
    ))
Exit /B 0
1
V1RTuE
25.11.2022, 04:49  [ТС]     Поиск и копирование текста "от и до" из файла по заданным значениям
  #12

Не по теме:

Цитата Сообщение от Karen87 Посмотреть сообщение
Исключает проблемы при наличии пробелов
А в некоторых случаях, наоборот, может их создать. Например, есть такой код у меня для блокировки 1С-ке доступа в инет:
Windows Batch file
1
2
3
4
5
6
7
NetSh Advfirewall set allprofiles state on
if exist "C:\Program Files\1cv8\*.*" set dir1="C:\Program Files\1cv8\*.exe"
if exist "C:\Program Files (x86)\1cv8\*.*" set dir2="C:\Program Files (x86)\1cv8\*.exe"
for /f "delims=" %%f in ('dir /b /s /a-d %dir1%,%dir2%') do (
netsh advfirewall firewall add rule name="1C %%f" dir=in action=block program="%%f" enable=yes profile=any
netsh advfirewall firewall add rule name="1C %%f" dir=out action=block program="%%f" enable=yes profile=any
)
если во 2 и 3 строке поставить кавычки перед dir1/dir2
Windows Batch file
1
2
if exist "C:\Program Files\1cv8\*.*" set "dir1=C:\Program Files\1cv8\*.exe"
if exist "C:\Program Files (x86)\1cv8\*.*" set "dir2=C:\Program Files (x86)\1cv8\*.exe"
В 4-й строке "%dir1%","%dir2%", соответственно, надо будет взять в кавычки, и такой папки не окажется, то скрипт добавит в брандмауэр все exe файлы из запускаемой папки, где находится батник.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2022, 04:49

База данных "Программа Склад". Поиск по заданным ключам
Собрал из 3 программок и примеров одну,часть писал по учебнику Павловской. Почему то ругается на...

Структура "Маршруты", поиск информации о маршруте с заданным номером
Описать структуру с именем ITNR: Описать структуру с именем ITNR, которая содержит следующие поля:...

Cтруктура "Автомобиль", поиск по заданным критериям
Создать структуру Car: id, Марка, Модель, Год выпуска, Цвет, Цена, регистрационный номер. Создать...

В каждом слове текста замените "а" на букву "е", если "а" стоит на четном месте, и заменить букву "б" на сочет
В каждом слове текста замените &quot;а&quot; на букву &quot;е&quot;, если &quot;а&quot; стоит на четном месте, и заменить букву...

Копирование текста из Edit от последнего "/" до конца
Есть текст в эдит: &quot;GA:111/PA:121/.../MA:541&quot;. Требуется что бы текст после последней &quot;/&quot; попал в...

удалить из текстового файла все комментарии (в частности, определяемые знаками "/", "//", "{", "}").
Здравствуйте! Ребят, помогите, пожалуйста, кто чем сможет. Задание таково: удалить из текстового...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru