Windows PowerShell ile eşleşen kısmi bir dizeye dayalı olarak bir metin dosyasındaki tüm satırları silme


22

Bu yüzden, sıralamak ve belirli bir anahtar kelime içeren satırların tüm oluşumlarını kaldırmak için birkaç büyük metin dosyaları var. Temel olarak, eğer bu satırlarım varsa:

Bu bir test değil
Bu bir testtir
Belki bir test
Kesinlikle bir test değil

Ve betiği 'not' ile çalıştırıyorum, 1. ve 4. satırları tamamen silmem gerekiyor.

Ben denedim:

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

ancak tüm satırın değil, yalnızca 'Program'ın yerine geçer.

Yanıtlar:


25

İşte yapacağım şey:

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

Snark'ın çizgisi de aynıdır, ancak tüm dosyaları bir dizi içine yüklemekle başlar; bu, bellek açısından büyük dosyalar ile sorunlu olabilir.


Ham dosyada eski fırsatlar ve dizeleri kesmek veya nesneleri biçimlendirmez Out-File yerine Set-Content kullanmanızı öneririm.
JasonMArcher

@JasonMArcher kullanarak bir örnek gönderebilir misiniz Set-Content? Bunun Set-Contentyerine bir yedek olduğuna inanmıyorum Out-File.
Iain Samuel McLean Elder

Get-Content .\in.txt | Where-Object {$_ -notmatch 'not'} | Set-Content out.txt Out-File temel olarak Set-Content'dir, ancak girdiyi basit dize dönüştürme yerine varsayılan biçimlendirme yoluyla çalıştırır.
22'de JasonMArcher

Aynı problemi yaşadım ve cevabım ihtiyacım olanın% 99'u. Son sorun, komutu $ değişkenli bir döngüde çalıştırıyorum (örneğin 'değil' yerine geçiyor). Eğer bir dize sabit kod mükemmel çalışır; ama bir değişken kullanırsam hiçbir şey yapmaz. Neden olduğu hakkında bir fikrin var mı? Ben hem çıplak değişkeni denedim ve "tırnak" koyarak
Stephen R

Bu , bu satırlardaki metni değiştirmek için nasıl değiştirilebilir
Tom

7

Bu çalışacak:

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

Bu sadece True adlı ikinci dosyada tek bir satır döndürür.

Düzeltme: Bu, ikinci dosyada 'True' dan oluşan tek bir satır döndürür. Her satırda bir kez çalışacak şekilde "Foreach-Object {$ _" eksik olabilir mi? Düzenleme: Aslında aslında ilgisiz, temizlemek için umuyordum dosyayı sildi. Yine de yardım için teşekkür ederim, ama gelecekte doğru komutun ne olacağını merak ediyorum.

1
Yukarıdaki 4 test çizginizle benim için çalışıyor.
Snark

2
Asla orijinal dosyanın üzerine yazmaz!
user33788

3
kabul ettim, ancak cevabı kolaylaştırmak için orijinal afişin kullandığı dosya adlarını kullandım. Hem giriş hem de çıkış için co2.txt kullandı.
Snark

0

-Notmatch seçeneğiyle 'Select-String'i de kullanabilirsiniz:

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

0

Sadece bu işe almak gerekiyordu ve aşağıdakileri ile geldi:

$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

Anahtar, bir komut dosyası bloğu (kıvırcık ayraçlar tarafından belirtildiği gibi) kullanan 'Where-Object' değişkeninin bir komut dosyası bloğu oluşturma olayında bildirilmesini gerektirmesidir.

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

hat.

Bu şekilde yapılandırarak, bir işlev oluşturulabilir, kısmen eşleştirmek için bir metin dizesi iletilebilir, komut dosyası bloğu oluşturma işlemini geçirilen değerle gerçekleştirebilir ve düzgün çalışmasını sağlayabilirsiniz.

Yukarıdaki yanıtlar, bir değişken içinde değiştirilecek değerin nasıl iletileceğini doğru bir şekilde açıklamaz.


Bunun Snark'ın (çok daha özlü) cevabından nasıl daha iyi olduğunu (daha açık bir şekilde) açıklayabilir misiniz ? Lütfen yorumlarda yanıt vermeyin; daha net ve eksiksiz hale getirmek için cevabınızı düzenleyin .
Scott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.