Имя пользователя:
Пароль:
 | Правила  

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

Ответить
Настройки темы
CMD/BAT - Поиск и копирование текста

Аватара для DenchikK

Старожил


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

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


Изменения
Автор: DenchikK
Дата: 05-04-2020
Как можно осуществить такую задачу:
Имеется текстовый файл, нужно найти определённое имя в строчке и скопировать всю эту найденную строчку и всю строчку ниже в другой файл. И так для всех вхождений в исходном файле.

Сейчас делаю очень тупо:
Для каждого нужного имени копирую исходный файл во временные файлы. К примеру, если надо найти 3 имени: dmitry, alexy, sergy то копирую исходный файл 3 раза. И в каждом удаляю всё, кроме нужного - в temp_dmitry, например, остаются строчки с вхождением dmitry и следующей строчки за ней. Потом эти файлы соединяю. Тупо, но как по другому осуществить задуманное, я понять не могу.

Удаляю всё, кроме нужного так:
Код: Выделить весь код
@echo off
set filename=temp_dmity.txt
ECHO Удаление всего, кроме 
sed.exe -i "/dmitry/,+1!d" %filename%
И вдогонку по этой же теме.
sed.exe -i "/dmitry/,+1!d" %filename% - эта команда для нахождения вхождения dmitry и 1 строчки ПОСЛЕ. А как, например, сделать, чтоб находилось вхождение и строчка ПЕРЕД? Пробовал вместо +1 писать -1 - не вышло.

Отправлено: 12:10, 05-04-2020

 

Старожил


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

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


Обязательно sed?
Для старых grep, которые без поддержки --no-group-separator (не нашёл под windows с оным):
Код: Выделить весь код
grep -B1 -P "(dmitry|alexy|sergy)" INPUT.TXT | grep -v "^--$" > OUTPUT.TXT
-B1 - захват 1 строки до искомой (Before)
-A1 - если надо захват 1 строки после искомой (After)
остальное в grep --help
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:04, 05-04-2020 | #2



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

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


Аватара для DenchikK

Старожил


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

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


Цитата iglezz:
Обязательно sed? »
Да хотелось бы...
Сейчас попробовал в AutoIT через StringSplit и последующей записью в другой файл FileWriteLine, вроде работает. Но хотелось бы понять, как это сделать в SED.

Добавлено:
Смотрю документацию grep, чтоб попробовать удалить искомую строчку и строчку выше, вроде бы так, но не выходит:
Код: Выделить весь код
egrep.exe -v -B1 "(dmitry|alexy|sergy)" 1.txt > 2.txt
Выходит только удалить просто строку:
Код: Выделить весь код
egrep.exe -v "(dmitry|alexy|sergy)" 1.txt > 2.txt

Последний раз редактировалось DenchikK, 05-04-2020 в 16:50.


Отправлено: 14:18, 05-04-2020 | #3


Ветеран


Contributor


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

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


Цитата DenchikK:
Но хотелось бы понять, как это сделать в SED. »
Если всё-таки важнее результат, то вот VBS
Код: Выделить весь код
FileIn = "Z:\Box_In\filein.txt"                 'Имя исходного файла
FileOut = "Z:\Box_In\fileout.txt"               'Имя выходного файла

WhatFind = Array("dmitry", "alexy", "sergy")    'Ключевые слова поиска
Prefix = ""                                    'Префикс ключевого слова, например " "
Suffix = ""                                    'Суффикс ключевого слова, например ","

Set FSO = CreateObject("Scripting.FileSystemObject")

Set Fin = FSO.OpenTextFile(FileIn, 1, False)
Text = Split(Fin.ReadAll, vbCrLf)
Fin.Close
    
N1 = LBound(Text)
NN = UBound(Text)
    
Set Fout = FSO.CreateTextFile(FileOut, 2)	', True)

With CreateObject("VBScript.RegExp")
    .IgnoreCase = True

    For Each Mem In WhatFind
        .Pattern = ".*" + Prefix + Mem + Suffix + ".*"
        
        For i = N1 To NN
            If .Test(Text(i)) Then
                Fout.WriteLine Text(i)
                If i + 1 <= NN Then Fout.WriteLine Text(i + 1)
            End If
        Next
    Next
End With

Fout.Close
Я попытался предусмотреть возможность исключить ложные выборки. Например, alex и alexy по ключевому литералу alex - одно и то же. (Сейчас в коде именно так, префикс и суффикс пустые). Поэтом безопаснее было бы определить, что такое слово c помощью префикса и суффикса, например " alex,".

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 05-04-2020 в 20:30.

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

Отправлено: 20:23, 05-04-2020 | #4



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Поиск и копирование текста из одного ini-файла в другой с помощью bat-ника Nun-Nun Скриптовые языки администрирования Windows 10 12-08-2016 22:32
VBS/WSH/JS - Поиск текста в файлах и копирование результата по сети anton_ego Скриптовые языки администрирования Windows 4 25-02-2013 12:42
CMD/BAT - [решено] Поиск и копирование нужного текста ajakzs Скриптовые языки администрирования Windows 1 07-08-2012 18:31
VBS/WSH/JS - [решено] Поиск и копирование текста из файла KaKTuZ49 Скриптовые языки администрирования Windows 2 03-11-2011 13:38
копирование текста volin Хочу все знать 10 08-01-2007 00:18




 
Переход