Windows PowerShell के साथ आंशिक स्ट्रिंग मिलान के आधार पर पाठ फ़ाइल में संपूर्ण पंक्तियों को हटाना


22

इसलिए मेरे पास कई बड़ी पाठ फाइलें हैं जिनके माध्यम से मुझे छांटने की जरूरत है, और उन सभी घटनाओं को दूर करना चाहिए जिनमें किसी दिए गए कीवर्ड शामिल हैं। मूल रूप से, अगर मेरे पास ये लाइनें हैं:

यह एक परीक्षण नहीं है
यह एक परीक्षा है
शायद एक परीक्षण
निश्चित रूप से एक परीक्षण नहीं है

और मैं स्क्रिप्ट को 'नहीं' के साथ चलाता हूं, मुझे पूरी तरह से लाइनों 1 और 4 को हटाने की आवश्यकता है।

मैं कोशिश कर रहा हूँ:

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

लेकिन यह केवल 'प्रोग्राम' को बदलता है न कि पूरी लाइन को।

जवाबों:


25

यहाँ मैं क्या करूँगा:

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

स्नार्क की रेखा भी ऐसा ही करती है, लेकिन यह फ़ाइल की सभी सरणी में लोड करने के साथ शुरू होती है, जो बड़ी फ़ाइलों के साथ मेमोरी-वार समस्याग्रस्त हो सकती है।


मेरा सुझाव है कि आप आउट-फाइल के बजाय सेट-कॉन्टेंट का उपयोग करें, कच्चे डेटा में पूर्व के सौदे और तार या प्रारूप वस्तुओं को नहीं काटेंगे।
जेसनमर्चर

क्या आप एक उदाहरण का उपयोग कर पोस्ट कर सकते हैं Set-Content? मुझे विश्वास नहीं है कि Set-Contentयह ड्रॉप-इन प्रतिस्थापन है Out-File
इयान सैमुअल मैकलीन एल्डर

Get-Content .\in.txt | Where-Object {$_ -notmatch 'not'} | Set-Content out.txt आउट-फाइल मूल रूप से सेट-सामग्री है, लेकिन यह सरल स्ट्रिंग रूपांतरण के बजाय डिफ़ॉल्ट स्वरूपण के माध्यम से इनपुट चलाता है।
जेसनम्रेचर

मुझे ठीक वैसी ही समस्या थी और आपको जवाब है कि मुझे जो चाहिए, उसका ९९% है। अंतिम मुद्दा यह है कि मैं $ लूप के साथ लूप में कमांड चला रहा हूं (आपके उदाहरण में 'नहीं' बदल रहा है)। अगर मैं एक कोड को कड़ा करता हूं तो यह पूरी तरह से काम करता है; लेकिन अगर मैं एक चर का उपयोग करता हूं तो यह कुछ भी नहीं करता है। कोई विचार क्यों? मैंने दोनों नंगे चर की कोशिश की है और इसे "उद्धरण" में रखा है
स्टीफन आर

उन पंक्तियों पर पाठ को बदलने के लिए इसे कैसे संशोधित किया जा सकता है
टॉम

7

यह काम करेगा:

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

यह केवल True नामक दूसरी फ़ाइल में एक ही लाइन देता है।

सुधार: यह केवल दूसरी फ़ाइल में 'ट्रू' से युक्त सिंगल लाइन देता है। क्या यह शायद "Foreach-Object {$ _" याद आ रहा है इसलिए यह प्रति पंक्ति एक बार चलता है? संपादित करें: वास्तव में यह अब अप्रासंगिक है, इसने उस फ़ाइल को मिटा दिया जिसकी मैं उम्मीद कर रहा था। वैसे भी मदद के लिए धन्यवाद, लेकिन मैं अभी भी उत्सुक हूं कि सही कमांड क्या होगा ताकि मैं भविष्य में ऐसा कर सकूं?

1
यह मेरे लिए आपके ऊपर 4 परीक्षण लाइनों के साथ काम करता है।
स्नार्क

2
यह मूल फ़ाइल को अधिलेखित कभी नहीं होता!
user33788

3
सहमत हुए, लेकिन मैंने मूल पोस्टर द्वारा उपयोग किए जाने वाले फ़ाइलनामों का उपयोग किया, ताकि उत्तर को आसान बनाया जा सके। उन्होंने इनपुट और आउटपुट दोनों के लिए co2.txt का इस्तेमाल किया।
स्नार्क

0

-नोटमैच विकल्प के साथ आप 'सिलेक्ट-स्ट्रिंग' का भी उपयोग कर सकते हैं:

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

0

मुझे बस यह काम करने की जरूरत है और निम्नलिखित के साथ आया:

$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

कुंजी यह है कि स्क्रिप्ट ब्लॉक (घुंघराले ब्रेसिज़ द्वारा दर्शाए गए) का उपयोग करते हुए 'व्हेयर-ऑब्जेक्ट' को स्क्रिप्ट ब्लॉक निर्माण घटना में चर घोषित करने की आवश्यकता होती है, इसलिए

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

लाइन।

इस तरह से इसे संरचित करके, कोई फ़ंक्शन बना सकता है, इसे आंशिक रूप से मिलान करने के लिए एक पाठ स्ट्रिंग पास कर सकता है, पारित मूल्य के साथ स्क्रिप्ट ब्लॉक निर्माण कर सकता है, और यह सही ढंग से काम कर सकता है।

ऊपर दिए गए उत्तर सही ढंग से नहीं बताते हैं कि किसी चर के भीतर प्रतिस्थापित किए जाने वाले मूल्य को कैसे पास किया जाए।


क्या आप समझा सकते हैं (अधिक स्पष्ट रूप से) यह कैसे Snark's (बहुत संक्षिप्त) उत्तर से बेहतर है ? कृपया टिप्पणियों में प्रतिक्रिया न दें; इसे स्पष्ट और अधिक पूर्ण बनाने के लिए अपना उत्तर संपादित करें।
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.