Câu trả lời:
Tập lệnh bạn đã đăng chuyển đổi các khoảng trắng 4 * n thành n tab, chỉ khi các khoảng trắng đó được đi trước bởi các tab.
Nếu bạn muốn thay thế 4 khoảng trắng bằng 2 khoảng trắng, nhưng chỉ trong thụt lề, trong khi có thể thực hiện bằng sed, tôi khuyên bạn nên thay thế Perl.
perl -pe 's{^((?: {4})*)}{" " x (2*length($1)/4)}e' file
Trong sed:
sed -e 's/^/~/' -e ': r' -e 's/^\( *\)~ /\1 ~/' -e 't r' -e 's/~//' file
Bạn có thể muốn sử dụng indent
thay thế.
Không phải cách làm việc đơn giản:
sed -r 's/ {4}/ /g'
Nếu không, đăng một số đầu vào nơi nó thất bại.
Nếu chỉ các không gian hàng đầu sẽ được chuyển đổi:
sed 'h;s/[^ ].*//;s/ / /g;G;s/\n *//'
Với nhận xét:
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'
Cũng nhìn vào 'ts'
thiết lập và :retab
lệnh của vim
'ts'
và :retab
không phải là giải pháp cho câu hỏi, nhưng có liên quan và có thể giúp giải quyết mục tiêu chung của bạn. Bạn có thể làm vim -- *.c
,:set ts=...
và sau đó :argdo retab
hoặc :argdo retab!
. Xem thêm 'sw'
tùy chọn và khả năng thụt lề của vim.
sed 's/^\( \+\)\1\1\1/\1\1/' file
Nó hoạt động bằng cách chia các không gian hàng đầu thành bốn trường hợp của cùng một nhóm (vì vậy tất cả chúng đều bằng nhau) và sau đó thay thế chúng chỉ bằng hai phiên bản của nhóm.
\+
). Cảm ơn bạn.
Nested quantifiers in regex; marked by <-- HERE in m/^( {4}* <-- HERE )/ at -e line 1.