sed 将 4 个空格转换为 2 个

sed 将 4 个空格转换为 2 个

如何将 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

这应该只会挤压前导空格序列。

相关内容