Answers:
您发布的脚本将4 * n个空格转换为n个制表符,只有这些空格前面仅带有制表符时才如此。
如果您想用2个空格替换4个空格,但只能以缩进形式替换,尽管可以用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'
还要看一下vim的'ts'
设置和:retab
命令
'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.