"선행 탭"을 탭당 특정 수의 공백으로 바꿀 수 있습니까? 저는 앞에 탭이나 공백만 있는 탭을 선행 탭으로 정의합니다. 저는 선행 탭이나 들여쓰기 탭을 앞에 공백만 있는 탭으로 정의합니다.
내 다음 줄은 .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