2012-07-03 3 views
5

각 줄의 처음부터 두 개의 공백을 탭으로 바꾸고 싶습니다. 나는 다음을 시도 :perl 공백으로 탭 바꾸기

s/^(\s{2})+/\t/gm; 

그것은 일을 일부러.

+1

'unexp 및 -t 2 ' –

+0

WHOLE 문자열을 대체 할 때마다 각 줄의 시작 부분에만 필요합니다. – snoofkin

+0

'--first-only' 사용 (gnu unexpand) –

답변

5

처럼 보인다 전체 파일을 살포했습니다.

$file =~ s/(?:\G|^)[ ]{2}/\t/mg; 
+0

+1은 \ G와 같은 경우에 유용합니다.) – raina77ow

+0

\ G의 존재를 잊어 버렸습니다. 이제는 더 이상 잊지 않을 것입니다. 감사 – snoofkin

1

대체 솔루션으로 /m 수정 자 없이는 긍정적 인 lookbehind를 사용할 수 있습니다. 각 /g 이중 공백 \s{2} 뒤에입니다 위의 예제 코드에서

$_ = " 123\n 456\n 789"; 
s/(?:(?<=^)|(?<=\n))\s{2}/\t/g; 
print $_; 

>> 이러한 접근 방식은 단지 라인의 시작하지, 다른 뭔가를 확인해야합니다 경우에 유용 할 수 있으므로 \m 수정 도움이되지 것입니다 때 문자열 (?<=^) 또는 (?: .. | ..) 새 줄 문자 (?<=\n)의 시작 부분은 \t으로 바뀝니다.

2

어때 대략 this?

my $test_string = " some test stuff\ndivided to\n provide the challenge"; 
$test_string =~ s/^[ ]{2}/\t/gm; 
print $test_string; 

설명 : \s 실제로 하나의 기호 별칭이 아니라 문자 '공백'클래스 : 그것은 \n\ 예를 들면 \t 모두 포함됩니다. 공백 만 바꾸려면 정규식에서 공백을 사용하십시오. 나에게 대신 /^ {2}/...의 문자 클래스를 (설정 당신은 할 필요가 없습니다, 더 읽기 (그리고)를 /xmodifier으로 중단되지 않습니다.

을 게다가, 당신은 단지 공간 기호를 바꾸려면 + 정량을 사용

UPDATE를 :. 당신이 두 개의 공백을 대체해야하는 경우, 내가 대신를 사용하는 것 같아요

$test_string =~ s#^((?:[ ]{2})+)#"\t" x (length($1)/2)#gme; 

... 나 이케 가미의 대답처럼 \ G 앵커 .

+0

네 개의 선행 공백에는 작동하지 않습니다. 광범위한 설명은 – ikegami

2

수량 한정자는 "하나 이상"을 의미하며 "정확하게 두 개의 공백 문자"를 의미하는 \s{2}에 적용됩니다. 간단한 예를 들어, 0에서 10 사이의 공백 문자열을 생성하고 비슷한 패턴으로 그들을 일치시킵니다.

#! /usr/bin/env perl 

use strict; 
use warnings; 

for (0 .. 10) { 
    $_ = " " x $_; 
    printf "%-13s %s\n", "[$_]:", /^(\s{2})+$/ ? "match!" : "no match."; 
} 

출력 :

서면으로
[]:   no match. 
[ ]:   no match. 
[ ]:   match! 
[ ]:  no match. 
[ ]:  match! 
[  ]:  no match. 
[  ]:  match! 
[  ]: no match. 
[  ]: match! 
[   ]: no match. 
[   ]: match!

, 당신의 패턴을 논리적 시작 -의 라인에 공백 문자의 긍정적 인 짝수에 대해 하나의 탭 문자를 대체합니다.

코드의 전반적인 내용을 제공하지 않습니다. /m 스위치와 /g 스위치를 사용하여 전체 운영을 원하는 파일의 전체 내용을 일부 텍스트로 가정합니다. 아래의 프로그램은 here-document를 사용하여 가정 된 상황을 시뮬레이트하고 각 줄의 처음 두 칸만 TAB로 바꿉니다.

#! /usr/bin/env perl 

use strict; 
use warnings; 

$_ = <<EOText; 
    Three 
    Two 
    Four 
    Five 
Zero 
One 
EOText 

s/^ /\t/mg; 

# for display purposes only 
s/\t/\\t/g; 

print; 

출력 : 여분이 s/// 코드에서 유지하지 않을 주석 것을

\t Three 
\tTwo 
\t Four 
\t Five 
Zero 
One

참고. 공백 문자와 탭 문자 사이에 대비를 추가합니다.

이것이 프로그램의 유일한 목적이라면, 쉬운 한 줄자가됩니다. 당신이 경우

$line =~ s/\G[ ]{2}/\t/g; 

: 당신이 라인으로 파일 라인을 읽는 경우 장소에

$ perl -pe 's/^ /\t/' input-file >output-file

편집을 사용하여, 수정 된 내용으로 새 파일을 만들려면

$ perl -i.bak -pe 's/^ /\t/' input-file
+0

+1입니다.) – raina77ow

관련 문제