Menghapus seluruh baris dalam file teks berdasarkan kecocokan string parsial dengan Windows PowerShell


22

Jadi saya memiliki beberapa file teks besar yang perlu saya sortir, dan menghapus semua kemunculan baris yang berisi kata kunci tertentu. Jadi pada dasarnya, jika saya memiliki garis-garis ini:

Ini bukan ujian.
Ini ujian.
Mungkin ujian.
Bukan ujian

Dan saya menjalankan skrip dengan 'tidak', saya harus menghapus seluruh baris 1 dan 4.

Saya sudah mencoba dengan:

PS C:\Users\Admin> (Get-Content "D:\Logs\co2.txt") | 
Foreach-Object {$_ -replace "3*Program*", ""} | 
Set-Content "D:\Logs\co2.txt"

tetapi itu hanya menggantikan 'Program' dan bukan seluruh baris.

Jawaban:


25

Inilah yang akan saya lakukan:

Get-Content .\in.txt | Where-Object {$_ -notmatch 'not'} | Set-Content out.txt

Baris Snark melakukan hal yang sama, tetapi dimulai dengan memuat semua file ke dalam array, yang mungkin bermasalah dengan file-file besar yang bijaksana.


Saya menyarankan agar Anda menggunakan Set-Content alih-alih Out-File, yang sebelumnya menangani data mentah dan tidak akan memotong string atau memformat objek.
JasonMArcher

@JasonMArcher Bisakah Anda memposting contoh menggunakan Set-Content? Saya tidak percaya itu Set-Contentadalah pengganti drop-in untuk Out-File.
Iain Samuel McLean Penatua

Get-Content .\in.txt | Where-Object {$_ -notmatch 'not'} | Set-Content out.txt Out-File pada dasarnya adalah Set-Content, tetapi menjalankan input melalui format default alih-alih konversi string sederhana.
JasonMArcher

Saya memiliki masalah yang sama persis dan jawaban Anda adalah 99% dari yang saya butuhkan. Masalah terakhir adalah saya menjalankan perintah dalam satu lingkaran dengan variabel $ (menggantikan 'tidak' dalam contoh Anda). Jika saya membuat kode string, itu berfungsi dengan baik; tetapi jika saya menggunakan variabel itu tidak apa-apa. Ada yang tahu kenapa? Saya sudah mencoba kedua variabel telanjang dan memasukkannya ke dalam "tanda kutip"
Stephen R

Bagaimana ini bisa dimodifikasi untuk mengganti teks pada baris tersebut
Tom

7

Ini akan bekerja:

(Get-Content "D:\Logs\co2.txt") -notmatch "not" | Out-File "D:\Logs\co2.txt"

Ini hanya mengembalikan satu baris dalam file kedua bernama True.

Koreksi: Ini hanya mengembalikan satu baris dalam file kedua yang terdiri dari 'Benar'. Apakah mungkin melewatkan "Foreach-Object {$ _" jadi itu berjalan sekali per baris? Sunting: Yah sebenarnya itu tidak relevan sekarang, itu menghapus file yang saya harap akan dihapus. Terima kasih atas bantuannya, tapi saya masih penasaran apa perintah yang benar sehingga saya bisa melakukan ini di masa depan?

1
Ini bekerja untuk saya dengan 4 jalur tes Anda di atas.
Snark

2
tidak akan pernah menimpa file aslinya!
user33788

3
setuju, tetapi saya menggunakan nama file yang sama seperti yang digunakan oleh poster asli, untuk membuat jawabannya lebih mudah. Dia menggunakan co2.txt untuk input dan output.
Snark

0

Anda juga bisa menggunakan 'Select-String' dengan opsi -notmatch:

Select-String 'not' .\input.txt -notmatch | % {$_.Line} | set-content output.txt

0

Saya hanya perlu menjalankan ini dan membuat yang berikut:

$InServerName = 'SomeServerNameorIPAddress'
$InFilePath = '\Sharename\SomePath\'
$InFileName = 'Filename.ext'

$OutServerName = 'SomeServerNameorIPAddress'
$OutFilePath = '\Sharename\SomePath\'
$OutFileName = 'Filename.out'

$InFile = -join('\\',$InServerName,$InFilePath,$InFilename)
$OutFile = -join('\\',$OutServerName,$OutFilePath,$OutFilename)
$FindStr = 'some string to match on'
$CompareStr = [scriptblock]::Create($FindStr)
$CompareStr
Get-Content $InFile | Where-Object {$_ -notmatch $CompareStr} | Set-Content $OutFile
Get-Content $OutFile

Kuncinya adalah bahwa 'Tempat-Objek' menggunakan blok skrip (seperti yang ditunjukkan oleh kurung kurawal) mengharuskan mendeklarasikan variabel dalam acara pembuatan blok skrip, karenanya

$CompareStr = [scriptblock]::Create($FindStr)

baris.

Dengan menyusunnya dengan cara ini, seseorang dapat membuat fungsi, meneruskannya string teks untuk mencocokkan sebagian, melakukan pembuatan blok skrip dengan nilai yang diteruskan, dan membuatnya berfungsi dengan benar.

Jawaban di atas tidak menjelaskan dengan benar cara meneruskan nilai yang akan diganti dalam suatu variabel.


Bisakah Anda menjelaskan (lebih jelas) bagaimana ini lebih baik daripada jawaban Snark (jauh lebih ringkas) ? Tolong jangan menanggapi dalam komentar; edit jawaban Anda untuk membuatnya lebih jelas dan lebih lengkap.
Scott
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.