Відповіді:
Опублікований сценарій перетворює 4 * n пробілів у n вкладок, лише якщо цим пробілам передують лише вкладки.
Якщо ви хочете замінити 4 пробіли на 2 пробіли, але лише з відступом, хоча це можна зробити за допомогою sed, я рекомендую натомість Perl.
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'
Також подивіться 'ts'налаштування та :retabкоманду vim
'ts'і :retabне вирішення питання, але пов'язані між собою і може допомогти в рішенні вашої спільної мети. Можна зробити vim -- *.c, :set ts=...а потім :argdo retabабо :argdo retab!. Дивіться також 'sw'опцію та власні можливості відступу vim.
sed 's/^\( \+\)\1\1\1/\1\1/' file
Він працює, розділивши провідні пробіли на чотири екземпляри однієї групи (тому всі вони рівні), а потім замінивши їх лише двома екземплярами групи.
\+). Дякую.
Nested quantifiers in regex; marked by <-- HERE in m/^( {4}* <-- HERE )/ at -e line 1.