विंडोज बैच फ़ाइल - एक सीमांकक के बाद डेटा हटाएं


0

मैंने कई उदाहरण देखे हैं कि मुझे क्या चाहिए, और बिना सफलता के उन लोगों को संशोधित करने की कोशिश की है।

प्रारंभिक जानकारी:

a:b:c:d:e:f

वांछित प्रारूप:

a:b

जानकारी 1 पाठ फ़ाइल में चिपकाई जाएगी paste_here.txtऔर आउटपुट एक नई फ़ाइल पर जाना चाहिए check.txt

मेरा वर्तमान प्रयास है:

@ तो बंद
setlocal

for / f "tokens = 1,2 delims =:" %% a (paste_here.txt) करते हैं (echo %% a >> check.txt)

जवाबों:


1

आपका प्रश्न स्पष्ट नहीं है। नमूना इनपुट और आउटपुट प्रदान करना अच्छी बात है, लेकिन आपको अपनी आवश्यकताओं को भी समझाना चाहिए।

मुझे लगता है कि आपके पास प्रत्येक पंक्ति पर कई कोलोन सीमांकित स्तंभ हैं, और आप प्रत्येक पंक्ति के पहले दो स्तंभों को संरक्षित करना चाहते हैं। मैं यह भी मान रहा हूं कि कॉलम की चौड़ाईएं परिवर्तनशील हैं, भले ही आपके उदाहरण में प्रति कॉलम केवल एक बार चरित्र हो।

आपका कोड केवल पहले कॉलम को संरक्षित कर रहा है। दूसरे को संरक्षित करना कठिन नहीं है:

@echo off
setlocal
for /f "tokens=1,2 delims=:" %%A in (paste_here.txt) do >>check.txt echo %%A:%%B

लेकिन एक संभावित समस्या है - यह विफल हो जाएगा यदि दूसरा कॉलम गायब है। उदाहरण के लिए,

a::c:d:e:f

निकलेगा

a:c

क्योंकि लगातार परिसीमनियों को For / F द्वारा एक एकल परिसीमनकर्ता के रूप में माना जाता है।

इसे ठीक करना मुश्किल नहीं है, लेकिन इसके लिए कुछ उन्नत बैच तकनीकों की आवश्यकता होती है।

  • आप बाहरी लूप में पूरी लाइन को संरक्षित कर सकते हैं और उद्धरणों में प्रत्येक कॉलम को संलग्न करने के लिए खोज / प्रतिस्थापन का उपयोग कर सकते हैं। फिर ~आउटपुट के दौरान उद्धरणों को हटाने के लिए कॉलम और संशोधक को पार्स करने के लिए एक 2 लूप का उपयोग किया जा सकता है ।

  • विलंबित विस्तार को उन चर के साथ काम करने की आवश्यकता होती है जो एक ही लूप के भीतर सेट और विस्तारित होते हैं।

  • विलंबित विस्तार !सामग्री में प्रकट हो सकने वाली सुरक्षा के लिए चालू और बंद किया जाता है। !यदि विस्तार में देरी हो रही है तो सक्षम होने के साथ परिवर्तनशील सामग्री को दूषित कर दिया जाएगा।

  • बाहरी फ़ोर / एफ स्टेटमेंट में विषम विकल्प वाक्यविन्यास ईओएल विकल्प को निष्क्रिय करने और DELIMS को कुछ भी नहीं करने के लिए सेट करने का एक तरीका है ताकि यह सामग्री की परवाह किए बिना पूरी लाइन को संरक्षित करे।

यह भी ध्यान दें कि कोष्ठक का उपयोग करना अधिक कुशल (तेज) है और प्रति पंक्ति एक बार के बजाय संपूर्ण फ़ाइल के लिए एक बार पुनर्निर्देशित करना।

@echo off
setlocal disableDelayedExpansion
>check.txt (
  for /f delims^=^ eol^= %%A in (paste_here.txt) do (
    set "ln=%%A"
    setlocal enableDelayedExpansion
    set "ln="!ln::=":"!""
    for /f "tokens=1,2 delims=:" %%B in ("!ln!") do echo %%~B:%%~C
    endlocal
  )
)

या आप एक हाइब्रिड JScript / बैच उपयोगिता का उपयोग कर सकते हैं, जिसे REPL.BAT कहा जाता है, यह आपके कार्य को एक चरण में कुशलतापूर्वक पूरा करने के लिए है। REPL.BAT एक रेगेक्स खोज करता है / स्टड पर प्रतिस्थापित करता है और स्टडआउट के लिए परिणाम लिखता है। यह शुद्ध स्क्रिप्ट है जो किसी भी विंडोज मशीन पर XP से आगे बढ़ेगी।

type paste_here.txt | repl "^(.*?:.*?):.*" $1 >check.txt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.