Jawaban:
Skrip yang Anda posting mengonversi 4 * n spasi menjadi n tab, hanya jika spasi tersebut didahului hanya dengan tab.
Jika Anda ingin mengganti 4 spasi dengan 2 spasi, tetapi hanya dalam lekukan, sementara itu mungkin dilakukan dengan sed, saya sarankan Perl sebagai gantinya.
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
Anda mungkin ingin menggunakannya indent
.
Tidak dengan cara langsung:
sed -r 's/ {4}/ /g'
Jika tidak, posisikan beberapa input jika gagal.
Jika hanya spasi yang akan dikonversi:
sed 'h;s/[^ ].*//;s/ / /g;G;s/\n *//'
Dengan komentar:
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'
Juga lihat 'ts'
pengaturan dan :retab
perintah vim
'ts'
dan :retab
bukan solusi untuk pertanyaan, tetapi terkait dan dapat membantu mengatasi sasaran keseluruhan Anda. Anda bisa melakukannya vim -- *.c
, :set ts=...
lalu :argdo retab
atau kemudian :argdo retab!
. Lihat juga 'sw'
opsi dan kemampuan indentasi vim sendiri.
sed 's/^\( \+\)\1\1\1/\1\1/' file
Ini bekerja dengan membagi spasi memimpin menjadi empat instance dari grup yang sama (jadi mereka semua sama) dan kemudian menggantinya dengan hanya dua instance dari grup.
\+
). Terima kasih.
Nested quantifiers in regex; marked by <-- HERE in m/^( {4}* <-- HERE )/ at -e line 1.