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タブに変換します。

インデントのために4つのスペースを2つのスペースに置き換えたい場合は、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'

'ts'また、vimの設定と:retabコマンドを見てください。

答え4

sed 's/    \{2,4\}\( \{0,1\}[^ ].*\)*/  \1/g' <input

これは先行空白シーケンスのみを圧縮する必要があります。

関連情報