Odpowiedzi:
Wysłany skrypt konwertuje 4 * n spacji na n tabulatorów, tylko jeśli te spacje są poprzedzone tylko tabulatorami.
Jeśli chcesz zastąpić 4 spacje 2 spacjami, ale tylko z wcięciem, chociaż można to zrobić za pomocą sed, polecam zamiast tego Perla.
perl -pe 's{^((?: {4})*)}{" " x (2*length($1)/4)}e' file
W sed:
sed -e 's/^/~/' -e ': r' -e 's/^\( *\)~ /\1 ~/' -e 't r' -e 's/~//' file
Możesz indent
zamiast tego użyć .
Czy prosty sposób nie działa:
sed -r 's/ {4}/ /g'
Jeśli nie, opublikuj dane wejściowe tam, gdzie się nie powiedzie.
Jeśli mają być konwertowane tylko spacje wiodące:
sed 'h;s/[^ ].*//;s/ / /g;G;s/\n *//'
Z komentarzami:
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'
Zobacz także 'ts'
ustawienia i :retab
polecenia vima
'ts'
i :retab
nie są to rozwiązania pytania, ale są powiązane i mogą pomóc w osiągnięciu ogólnego celu. Możesz zrobić vim -- *.c
, :set ts=...
a następnie :argdo retab
lub :argdo retab!
. Zobacz także 'sw'
opcję i własne możliwości wcięcia vima.
sed 's/^\( \+\)\1\1\1/\1\1/' file
Działa, dzieląc wiodące spacje na cztery wystąpienia tej samej grupy (więc wszystkie są równe), a następnie zastępując je tylko dwoma wystąpieniami grupy.
\+
). Dziękuję Ci.
Nested quantifiers in regex; marked by <-- HERE in m/^( {4}* <-- HERE )/ at -e line 1.