В моем сценарии мне нужно проверить мой файл (XXX.txt) на слово « SPOT ». В файле будет мало слов SPOT .

Теперь мне нужен скрипт, чтобы написать верхнюю 2 строку слова « SPOT » в новом текстовом штрафе и назвать его « done.txt ».

ПРИМЕР XXX.txt

dfsfs
clip_id HDX
title Setiap hari
type PROMO
end
clip_id HDQ
title Citra
type SPOT
end
clip_id HDX
title Ri
type PROMO
end
clip_id HDX
title sni
type SPOT

поэтому мне нужно написать " done.txt ", как показано ниже.

clip_id HDQ
title Citra

clip_id HDX
title sni

Посоветуйте пожалуйста скрипт для этого.

Большое спасибо

2 ответа2

0

Я настоятельно рекомендую JREPL.BAT - гибридную утилиту JScript/batch, которая выполняет замену текста регулярными выражениями. JREPL.BAT - это чистый скрипт, который изначально запускается на любой платформе Windows, начиная с XP.

Если предположить, что JREPL.BAT находится в вашем текущем каталоге или, что еще лучше, где-то в вашем PATH, то простая однострочная командная строка эффективно решит вашу проблему:

jrepl "^((.*\n){2})type SPOT$" $1 /m /jmatch /f xxx.txt /o done.txt
  • Параметр /M multiline позволяет выполнять поиск через новые строки.
  • Параметр /JMatch печатает только строки замены для совпадений

Поскольку JREPL является пакетным скриптом, вы должны использовать CALL JREPL, если вы используете его в другом скрипте.

Полная документация доступна из командной строки, используя jrepl /? , Вы можете использовать jrepl /?|more чтобы увидеть справку по одной странице за раз. Я никогда не использую БОЛЬШЕ, потому что мое окно консоли cmd.exe сконфигурировано с большим выходным буфером, который позволяет мне прокручивать вверх, чтобы увидеть прошлые результаты.

0

Вот решение в Powershell, преемнике Microsoft cmd:

# variables that you need to set
$source = "C:\temp\superuser.txt"
$destination = "C:\temp\done.txt"

#region easier to understand for PS newcomers
$hits = select-string -Path $source -SimpleMatch "SPOT" -CaseSensitive
$filecontents = get-content $source

foreach($hit in $hits)
{
    $filecontents[$hit.linenumber-3] | out-file -append $destination
    $filecontents[$hit.linenumber-2] | out-file -append $destination
    "" | out-file -append $destination
}
#endregion


#region shorter version
$hits = select-string -Path $file -SimpleMatch "SPOT" -CaseSensitive -context 2

foreach($hit in $hits)
{
    $hit.context.PreContext | out-file -append $destination
    "" | out-file -append $destination
}
#endregion

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .