Ответы:
Размещенный вами скрипт преобразует 4 * n пробелов в n вкладок, только если этим пробелам предшествуют только вкладки.
Если вы хотите заменить 4 пробела на 2 пробела, но только с отступом, хотя это можно сделать с помощью sed, я рекомендую вместо этого Perl.
perl -pe 's{^((?: {4})*)}{" " x (2*length($1)/4)}e' file
В седе:
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.