如何将 4 个空格转换为 2 个空格sed
?是否可以?
我发现了这个,但它将制表符转换为空格:
sed -r ':f; s|^(\t*)\s{4}|\1\t|g; t f' file
答案1
您发布的脚本将 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
反而。
答案2
直接的方法行不通:
sed -r 's/ {4}/ /g'
如果没有,请在失败的地方发布一些输入。
答案3
如果只转换前导空格:
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
命令
答案4
sed 's/ \{2,4\}\( \{0,1\}[^ ].*\)*/ \1/g' <input
这应该只会挤压前导空格序列。