Войти

Показать полную графическую версию : Поиск и копирование текста


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

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




© OSzone.net 2001-2012