file batch untuk menemukan kata, ekstrak 2 baris di atas kata dan tulis dalam file teks yang berbeda

0

Dalam skenario saya, saya perlu memeriksa file saya ( XXX.txt) untuk kata " SPOT ". Akan ada beberapa kata SPOT dalam file.

Sekarang saya perlu skrip untuk menulis 2 baris teratas kata " SPOT " dalam denda teks baru dan beri nama " done.txt".

CONTOH 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

jadi saya perlu menulis " done.txt" seperti di bawah ini.

clip_id HDQ
title Citra

clip_id HDX
title sni

Mohon saran untuk skrip untuk melakukan ini.

Terimakasih banyak

Poobalan
sumber
Selamat datang di Pengguna Super. Sayangnya, kami bukan layanan penulisan kode. Alih-alih hanya meminta kode untuk melakukan tugas tertentu, tunjukkan kepada kami apa yang telah Anda coba sejauh ini (termasuk kode apa pun yang Anda miliki) dan di mana Anda terjebak sehingga kami dapat membantu Anda dengan masalah spesifik Anda. Pertanyaan yang hanya meminta kode terlalu luas dan kemungkinan akan ditunda atau ditutup
DavidPostill
Untuk .batsolusi CLI murni , Anda bisa mulai dengan membandingkan output dari findstr /n /i "spot" "xxx.txt"perintah dan dari findstr /n /R $ "xxx.txt"lalu memperlakukannya dalam dua FOR /F perintah loop bersarang . Jangan ragu untuk kembali ke sini dan mengedit pertanyaan Anda mengikuti petunjuk komentar @vidaostill.
JosefZ

Jawaban:

0

Inilah solusinya di Powershell, penerus cmd Microsoft:

# 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
megamorf
sumber
hai megamorf thnak kasih atas kodingnya. Tetapi apakah saya harus menyimpan ini sebagai file .bat atau .ps1? Saya seorang pemula dan saya selesai melihat output apa pun jika dijalankan sebagai .bat ... tolong beri tahu saya .. terima kasih banyak!
Poobalan
Simpan skrip sebagai .ps1, Anda dapat menjalankannya dari Powershell hanya dengan memasukkan path ke skrip atau menjalankannya melalui batch seperti: powershell -executionpolicy bypass C: \ temp \ myscript.ps1
megamorf
Windows PowerShell Hak Cipta (C) 2009 Microsoft Corporation. Seluruh hak cipta. PS C: \ Users \ pmpooba \ Desktop \ SPOT COMMERCIAL> test4 Istilah 'test4' tidak dikenal sebagai nama cmdlet, fungsi, file skrip, atau program yang bisa dijalankan. Periksa ejaan nama, atau jika jalur dimasukkan, verifikasi bahwa jalur itu benar dan coba lagi. Pada baris: 1 karakter: 6 + test4 <<<< + KategoriInfo: ObjectNotFound: (test4: String) [], CommandNotFou ndException + FullyQualifiedErrorId: CommandNotFoundException PS C: \ Users \ pmpooba \ Desktop \ SPOT COMMERCIAL> ----- -> ini adalah output :(
Poobalan
Saya menganggap skrip Anda disebut test4? Sebut seperti ini. \ Test4.ps1 Powershell mengharapkan Anda untuk mereferensikan skrip atau binari dengan ekstensi file mereka dan jalur relatif atau absolut untuk alasan keamanan. Seseorang bisa saja meletakkan test4.exe berbahaya di direktori yang sama dan itu akan dipanggil sebagai gantinya jika langkah keamanan itu tidak ada.
megamorf
ya itu tidak bisa dijalankan karena beberapa kebijakan keamanan ... dapat menyimpan skrip yang sama dengan .bat? jika tidak. Di mana saya harus melakukan perubahan .... jutaan terima kasih
Poobalan
0

Saya sangat merekomendasikan JREPL.BAT - utilitas JScript / batch hybrid yang melakukan penggantian teks ekspresi reguler . JREPL.BAT adalah skrip murni yang berjalan secara native di platform Windows mulai XP dan seterusnya.

Dengan asumsi JREPL.BAT ada di direktori Anda saat ini, atau lebih baik lagi, di suatu tempat dalam PATH Anda, maka, satu baris perintah sederhana secara efisien menyelesaikan masalah Anda:

jrepl "^((.*\n){2})type SPOT$" $1 /m /jmatch /f xxx.txt /o done.txt
  • The /Mpilihan multiline memungkinkan pencarian accross baris.
  • The /JMatchpilihan cetak hanya string pengganti pertandingan

Karena JREPL adalah skrip batch, Anda harus menggunakan CALL JREPL jika Anda menggunakannya dalam skrip lain.

Dokumentasi lengkap tersedia dari baris perintah menggunakan jrepl /?. Anda mungkin ingin menggunakan jrepl /?|moreuntuk melihat bantuan satu halaman sekaligus. Saya tidak pernah menggunakan LEBIH karena jendela konsol cmd.exe saya dikonfigurasi dengan buffer keluaran besar yang memungkinkan saya untuk menggulir ke atas untuk melihat keluaran sebelumnya.

dbenham
sumber
hai..ini adalah apa yang saya lakukan..tapi gagal .. @ echo pada setlocal enabledelayedexpansion set src = C: \ Users \ pmpooba \ Desktop \ PGM \ xxx.txt set dst = C: \ Users \ pmpooba \ Desktop \ PGM \ done.txt jrepl "^ ((. * \ n) {2}) ketik SPOT $" $ 1 / m / jmatch / f% src% / o% dst%) jeda
Poobalan
Saya menguji kode saya, dan itu berhasil. Anda memiliki tambahan )di akhir perintah JREPL yang menyebabkannya gagal. Juga, Anda harus meletakkan PANGGILAN sebelum JREPL jika Anda ingin skrip untuk melanjutkan - jika tidak, perintah PAUSE Anda tidak akan diaktifkan.
dbenham