Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Поиск и копирование текста (http://forum.oszone.net/showthread.php?t=344692)

DenchikK 05-04-2020 12:10 2915874

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

Сейчас делаю очень тупо:
Для каждого нужного имени копирую исходный файл во временные файлы. К примеру, если надо найти 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 - не вышло.

iglezz 05-04-2020 14:04 2915886

Обязательно 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

DenchikK 05-04-2020 14:18 2915889

Цитата:

Цитата 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

megaloman 05-04-2020 20:23 2915934

Цитата:

Цитата 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,".


Время: 00:08.

Время: 00:08.
© OSzone.net 2001-