sed 4 रिक्त स्थान को 2 में परिवर्तित करता है


14

कैसे एक 4 रिक्त स्थान को 2 स्थानों में परिवर्तित करता है sed ? क्या यह संभव है?

मैंने यह पाया लेकिन यह टैब को रिक्त स्थान में परिवर्तित करता है:

sed -r ':f; s|^(\t*)\s{4}|\1\t|g; t f' file

जवाबों:


13

आपके द्वारा पोस्ट की गई स्क्रिप्ट 4 * n रिक्त स्थान को n टैब में कनवर्ट करती है, केवल अगर वे स्थान केवल टैब से पहले हैं।

यदि आप 4 स्थानों को 2 स्थानों से बदलना चाहते हैं, लेकिन केवल इंडेंटेशन में, जबकि इसे सीड के साथ करना संभव है, तो मैं इसके बजाय पर्ल की सलाह देता हूं।

perl -pe 's{^((?: {4})*)}{" " x (2*length($1)/4)}e' file

Sed में:

sed -e 's/^/~/' -e ': r' -e 's/^\( *\)~    /\1  ~/' -e 't r' -e 's/~//' file

आप indentइसके बजाय उपयोग करना चाह सकते हैं ।


मुझे मिलाNested quantifiers in regex; marked by <-- HERE in m/^( {4}* <-- HERE )/ at -e line 1.
eddygeek

1
@eddygeek ओह, वास्तव में, वह और कुछ अन्य कीड़े। मैंने वास्तविक पर्ल कोड द्वारा gobbledygook को बदल दिया।
गिल्स एसओ- बुराई को रोकें '

5

सीधा रास्ता काम नहीं करता है:

sed -r 's/ {4}/  /g'

यदि नहीं, तो कुछ इनपुट पोस्ट करें जहां यह विफल रहता है।


1
यह लाइन की शुरुआत के लिए बहाल नहीं है। यदि आप इसे वहां लंगर डालते हैं, तो यह कई मैचों के लिए काम नहीं करेगा। तो हम नीचे unix.stackexchange.com/a/375200/259620 पर हैं।
geek-merlin

यह काम नहीं करता है यदि आपके पास 2 रिक्त स्थान और 4 रिक्त स्थान का संयोजन है, क्योंकि दो के दो इंडेंटेशन को चार के रूप में गिना जाएगा ...
मैट फ्लेचर

@ एक्सल: ओपी द्वारा यह आवश्यकता नहीं थी
थोर

@mattfletcher: प्रश्न 2 के साथ 4 रिक्त स्थान को बदलने के बारे में था, इसलिए मैं आपकी बात को देखने में विफल रहा
Thor

4

यदि केवल प्रमुख स्थानों को परिवर्तित किया जाए:

sed 'h;s/[^ ].*//;s/    /  /g;G;s/\n *//'

टिप्पणियों के साथ:

sed '
  h; # save a copy of the pattern space (filled with the current line)
     # onto the hold space
  s/[^ ].*//; # remove everything starting with the first non-space
              # from the pattern space. That leaves the leading space
              # characters
  s/    /  /g; # substitute every sequence of 4 spaces with 2.
  G; # append a newline and the hold space (the saved original line) to
     # the pattern space.
  s/\n *//; # remove that newline and the indentation of the original
            # line that follows it'

Vim की 'ts'सेटिंग और :retabकमांड को भी देखें


अपने विम समाधान का उपयोग करना, क्या बैच के साथ कई फाइलों को संपादित करने का एक तरीका है? अन्यथा मैं अनुमान लगा रहा हूं कि मुझे एक मैक्रो बनाना होगा?
च्रिसलीली

ध्यान दें कि 'ts'और :retabप्रश्न के समाधान नहीं हैं, लेकिन संबंधित हैं और आपके समग्र लक्ष्य को संबोधित करने में मदद कर सकते हैं। आप कर सकते हैं vim -- *.c, :set ts=...और फिर :argdo retabया :argdo retab!'sw'विकल्प और विम की अपनी इंडेंटिंग क्षमताओं को भी देखें ।
स्टीफन चेज़लस

2
sed 's/^\( \+\)\1\1\1/\1\1/' file

यह एक ही समूह के चार उदाहरणों में अग्रणी स्थानों को विभाजित करके काम करता है (इसलिए वे सभी समान हैं) और फिर उन्हें समूह के केवल दो उदाहरणों के साथ बदल दिया जाता है।


यह मौजूदा समाधानों को कैसे बेहतर बनाता है?
फिलिप्पुस

1
यह विषम स्थानों को संरक्षित करता है, केवल प्रमुख व्हाट्सएप को प्रभावित करता है, वैश्विक ध्वज की आवश्यकता नहीं होती है, प्रतिस्थापन के दोनों तरफ किसी भी स्थान (या टैब) को संभालने के लिए आसानी से घुमाया जा सकता है और अधिक जटिल सेड कमांड का उपयोग नहीं करता है जो अधिक आकस्मिक उपयोगकर्ताओं के लिए ऑफ-पुटिंग हो सकती है। कई चीजों के साथ, चाहे वह एक बहुत ही व्यक्तिपरक हो, लेकिन खुद के लिए बोलना: लिपि में इसे खोजने से सूचीबद्ध कुछ अन्य समाधानों की तुलना में जल्दी से ग्रिप करना काफी आसान होगा।
मल

दिलचस्प। खुशी है कि मैंने पूछा। आमतौर पर वैश्विक झंडे के बजाय बैकरेफर को बुराई माना जाता है। लेकिन आप आसानी से अधिक पोर्टेबल स्क्रिप्ट (परहेज \+) के साथ एक ही चीज हासिल कर सकते हैं । धन्यवाद।
फिलिप्पुस

1
sed 's/    \{2,4\}\( \{0,1\}[^ ].*\)*/  \1/g' <input

यह केवल रिक्त स्थान के प्रमुख दृश्यों को निचोड़ना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.