들여쓰기된 탭을 탭당 고정된 수의 공백으로 대체

들여쓰기된 탭을 탭당 고정된 수의 공백으로 대체

"선행 탭"을 탭당 특정 수의 공백으로 바꿀 수 있습니까? 저는 앞에 탭이나 공백만 있는 탭을 선행 탭으로 정의합니다. 저는 선행 탭이나 들여쓰기 탭을 앞에 공백만 있는 탭으로 정의합니다.

내 다음 줄은 .nexrc다음에서 복사되었습니다.이것. 태그가 포함된 줄 a과 태그 사이의 줄에서 필터를 통과합니다. b탭을 대체합니다.

map \2 'a!'b pr -te2

그러나 선행하지 않는 탭 문자를 두 개의 공백으로 바꾸는 작업은 훌륭합니다. 때로는 리터럴 탭 문자가 필요하기 때문에 이상적이지 않습니다.

선행 탭만 탭당 특정 수의 공백으로 바꾸는 간단하고 이식 가능한 방법이 있습니까?

아래의 Perl 스크립트(한 줄로 축소 가능)는 선행 탭 문자를 명령줄에 제공된 너비로 바꾸는 작업을 수행하지만 Perl의 가용성에 의존하며 2차 시간이 걸립니다(파일에 아무것도 포함되지 않은 경우). 그러나 탭).

#!/usr/bin/env perl

use strict;
use warnings;

my ($width) = @ARGV;
$width //= 2;
my $replacement = ' ' x $width;

while (<>) {
    while (s/^(\s*)\t/$1$replacement/g) { }
    print;
}

다음은 제가 원하는 일의 예입니다. 줄 시작 부분의 너비가 0인 표시인 ^I탭 바이트를 나타냅니다 . #다음 줄은 바이트 규모입니다.

앞으로:

#^I^I ^Ia^Ib
# 1 23 45 67

이후(탭 너비는 2)

#       a^Ib
#12345678 90

이후(탭 너비는 4)

#             a^Ib
#12345678901234 56

답변1

다른 명령줄 도구를 사용하여 일반적인 솔루션을 찾고 있다면 Awk이 도구를 사용할 수 있습니다.

var=$'\t\t\tnewcontent'
echo "$var" | awk '{ gsub(/^[\t]+/," ",$0) }1'

위의 명령은 두 번째 매개변수 Tab에서 하나 이상의 항목을 단일 공백으로 대체합니다 . 필요한 공간을 생성하여 구성 가능하게 만들 수 있습니다.gsub

awk -v n=5 ' BEGIN{ spaces = sprintf("%"n"s"," ") }{ gsub(/^[\t]+/,spaces,$0) }1'

마지막 업데이트에서 OP는 선행 탭 수를 발견된 정확한 공백 수로 대체하려는 것 같습니다.

awk -F$'\t' '{ spaces = sprintf("%"(NF-1)"s"," "); gsub(/^[\t]+/,spaces,$0) }1'

논리는 필드 구분 기호를 \t실행 시 인식할 수 있는 선행 탭 문자 수로 설정하는 것입니다 NF-1. 선행 탭 수를 결정한 후에는 이를 사용하여 sprintf()이전 방법과 동일한 수의 공백을 생성합니다.

교체 확인 hexdump -C후 보실 수 있습니다

echo "$var" | hexdump -C
00000000  09 09 09 6e 65 77 63 6f  6e 74 65 6e 74 0a        |...newcontent.|
0000000e

지금 교체

echo "$var" | awk -F$'\t' '{ spaces = sprintf("%"(NF-1)"s"," "); gsub(/^[\t]+/,spaces,$0) }1' | hexdump -C
00000000  20 20 20 6e 65 77 63 6f  6e 74 65 6e 74 0a        |   newcontent.|
0000000e

관련 정보