जवाबों:
आपके द्वारा पोस्ट की गई स्क्रिप्ट 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इसके बजाय उपयोग करना चाह सकते हैं ।
सीधा रास्ता काम नहीं करता है:
sed -r 's/ {4}/ /g'
यदि नहीं, तो कुछ इनपुट पोस्ट करें जहां यह विफल रहता है।
यदि केवल प्रमुख स्थानों को परिवर्तित किया जाए:
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'विकल्प और विम की अपनी इंडेंटिंग क्षमताओं को भी देखें ।
sed 's/^\( \+\)\1\1\1/\1\1/' file
यह एक ही समूह के चार उदाहरणों में अग्रणी स्थानों को विभाजित करके काम करता है (इसलिए वे सभी समान हैं) और फिर उन्हें समूह के केवल दो उदाहरणों के साथ बदल दिया जाता है।
\+) के साथ एक ही चीज हासिल कर सकते हैं । धन्यवाद।
Nested quantifiers in regex; marked by <-- HERE in m/^( {4}* <-- HERE )/ at -e line 1.