प्रत्येक मिलान रेखा की शुरुआत में रिक्त स्थान जोड़ें


2

उदाहरण के लिए, यदि मेरे पास एक लाइन थी जो शुरुआत में थी, और इसे पूर्ववर्ती लाइन के साथ लाइन करने की आवश्यकता थी, तो मैं कैसे सबसे प्रभावी ढंग से कर सकता था।

      preceeding line
line I need to add spaces to

तो यह इस तरह दिखता है:

       predeeding line
       where it needs to start. 

इसकी ठीक 8 जगहें जहाँ से इसे शुरू करने की आवश्यकता है। मैं यह कैसे कर सकता हूँ vim, awk या sed या किसी अन्य टूल के साथ?

अन्य आवश्यकताएं / नोट:

ये लाइनें मेरी फ़ाइल में कई बार आती हैं और मैं केवल 100-500 लाइनों के बीच परिवर्तन करना चाहता हूं।


1
क्या आप चाहते हैं कि सभी स्थान 8 स्थानों द्वारा प्रेरित हों? या, क्या आप पूर्ववर्ती रेखा पर इंडेंट से मेल खाना चाहते हैं? क्या होगा यदि दो या अधिक गैर-इंडेंटेड लाइनें एक पंक्ति में दिखाई दें: क्या केवल पहले एक इंडेंट दिया जाना चाहिए? या, क्या वे सभी इंडेंट प्राप्त करते हैं?
John1024

पूर्ववर्ती रेखा से इंडेंट का मिलान करें। कोई भी गैर-इंडेंटेड लाइनें नहीं होनी चाहिए, जो लाइन मैं जोड़ना चाहता हूं, जब तक कि हम पूर्ववर्ती लाइन पर सटीक रूप से मेल खा सकें।
user53029

मुझे स्पष्ट करना चाहिए - कोई भी गैर-इंडेंटेड लाइनें नहीं होनी चाहिए जो हस्तक्षेप करेगी, जब तक कि हम इसके नीचे की लाइन में संशोधन करने के लिए इंडेंटेड लाइन पर मेल कर सकते हैं।
user53029

यह विम के लिए एक साधारण मामले की तरह दिखता है ऑटो इंडेंट । जब आप सही इंडेंटेशन और कॉल के साथ लाइन के नीचे शुरू करते हैं तो क्या होता है ==? ऐसा करने के लिए १००-५०० से १०१ की शुरुआत करें (१०० में सही इंडेंट है) और फिर टाइप करें 399== ऑटो इसके ऊपर की तरह अगले 399 लाइन इंडेंट करने के लिए।
Shadoath

जवाबों:


1

आइए इस परीक्षण फ़ाइल पर विचार करें:

$ cat file1
      preceeding line
line I need to add spaces to
    preceeding line
  preceeding line
line I need to add spaces to

निम्नलिखित गैर-इंडेंटेड लाइनों को पिछली लाइन के इंडेंट से मेल खाने के लिए प्रेरित करता है:

$ awk '{if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}} 1' file1
      preceeding line
      line I need to add spaces to
    preceeding line
  preceeding line
  line I need to add spaces to

यह काम किस प्रकार करता है

  • if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}

    यदि रेखा न तो रिक्त और न ही टैब से शुरू होती है, तो इंडेंट जोड़ें x लाइन की शुरुआत करने के लिए।

    एल्स, वेरिएंट को करंट लाइन से वेरिएबल में सेव करें x

  • 1

    यह प्रिंट-ऑफ-लाइन के लिए awk की क्रिप्टिक शॉर्टहैंड है।

बहु-पंक्ति संस्करण

उन लोगों के लिए जो कई लाइनों में फैले अपने कोड को पसंद करते हैं:

awk '
    {
        if (/^[^ \t]/) 
           $0=x $0
        else { 
            x=$0
            sub(/[^ \t].*/, "", x)
        }
    } 

    1' file1

500 के माध्यम से 100 तक लाइनों को बदलने पर प्रतिबंध

awk 'NR>=100 && NR<=500 {if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}} 1' file1

फ़ाइल को जगह में बदलना

GNU awk का उपयोग करना:

awk -i inplace 'NR>=100 && NR<=500 {if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}} 1' file1

BSD / OSX awk का उपयोग करना:

 awk 'NR>=100 && NR<=500 {if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}} 1' file1 >tmp && mv tmp file1

2

विम में:

:100,500g/^[^ ]/normal 0ky^jP

स्पष्टीकरण:

विम में "वैश्विक" कमांड एक निश्चित रीगेक्स से मेल खाने वाली हर लाइन पर एक पूर्व कमांड लागू करेगी। यह एक निश्चित श्रेणी की रेखाओं को प्रतिबंधित कर सकता है, इस मामले में 100-500। रेगेक्स यहाँ है

^[^ ]

जिसका अर्थ है कोई भी चरित्र के सिवाय लाइन की शुरुआत में एक स्थान के लिए। पूर्व कमान है

normal 0ky^jP

यह क्या करता है:

0           "Move to the first character on this line
 k          "Move up one line
  y^        "Yank up to the first non-whitespace character
    j       "Move down one line
     P      "Paste what we just yanked

इसे चलाने के बाद, बस कॉल करें

:wq

अपनी फ़ाइल को सहेजने और छोड़ने के लिए। आप यह सब कमांड लाइन से भी कर सकते हैं:

vim myfile.txt -c "100,500g/^[^ ]/normal 0ky^jP" -c "wq"

एक अन्य वैकल्पिक समाधान:

:%s/\v^(\s+).*\n\zs(\S)/\1\2

0

घर का पाठ? ; - & gt;

sed -e '100,500s/^[ ]*/        /' -i file

क्या यह सभी पंक्तियों को नहीं दर्शाएगा और न केवल मैं चाहता हूँ?
user53029

हां, यह सभी लाइनों की शुरुआत में केवल 8 रिक्त स्थान जोड़ देगा, जो वर्तमान में मौजूद किसी भी स्थान को बदल देगा।
dr.nixon
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.