Réponses:
Le script que vous avez publié convertit 4 * n espaces en n tabulations, uniquement si ces espaces sont précédés uniquement par des tabulations.
Si vous souhaitez remplacer 4 espaces par 2 espaces, mais uniquement en retrait, alors qu'il est possible de le faire avec sed, je recommande plutôt Perl.
perl -pe 's{^((?: {4})*)}{" " x (2*length($1)/4)}e' file
Dans sed:
sed -e 's/^/~/' -e ': r' -e 's/^\( *\)~ /\1 ~/' -e 't r' -e 's/~//' file
Vous voudrez peut-être utiliser à la indent
place.
La méthode simple ne fonctionne-t-elle pas:
sed -r 's/ {4}/ /g'
Sinon, postez une entrée là où elle échoue.
Si seuls les espaces de début doivent être convertis:
sed 'h;s/[^ ].*//;s/ / /g;G;s/\n *//'
Avec commentaires:
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'
Regardez également le 'ts'
réglage et la :retab
commande de vim
'ts'
et :retab
ne sont pas des solutions à la question, mais sont liés et peuvent aider à atteindre votre objectif global. Vous pouvez le faire vim -- *.c
, :set ts=...
puis :argdo retab
ou ou :argdo retab!
. Voir également l' 'sw'
option et les capacités de mise en retrait de vim.
sed 's/^\( \+\)\1\1\1/\1\1/' file
Il fonctionne en divisant les espaces de tête en quatre instances du même groupe (ils sont donc tous égaux), puis en les remplaçant par seulement deux instances du groupe.
\+
). Je vous remercie.
Nested quantifiers in regex; marked by <-- HERE in m/^( {4}* <-- HERE )/ at -e line 1.