Unix: 텍스트의 기호 뒤에 고유 이름 추가

Unix: 텍스트의 기호 뒤에 고유 이름 추가

다음과 같은 파일이 있습니다.

abcdefghijklmnopqrst
//
abcdefghijklmnopqrst
//
abcdefghijklmnopqrst

다음 코드를 사용하여 문서 시작 부분에 // 줄을 삽입했습니다(여기에 제안된 대로:텍스트 파일의 시작 부분에 텍스트 추가) 이 업데이트를 새 파일에 저장합니다.

sed '1s/^/\/\/\'$'\n/' File_1.txt > File_2.txt

그러나 내가 원하는 것은 각 // 뒤에 고유한 이름을 추가하는 것입니다. 결과는 다음과 같습니다.

// Text 1
abcdefghijklmnopqrst
// Text 2
abcdefghijklmnopqrst
// Text 3
abcdefghijklmnopqrst

등.

예를 들어 tr을 사용하여 번역할 수 있다고 생각합니다. "//"를 "//Text1"로 변환합니다. 하지만 다음 //에 텍스트 2를 추가하고, 세 번째 // 등에 텍스트 3을 추가하려면 어떻게 해야 할까요? txt 파일은 mac-osx에서 생성됩니다.

고쳐 쓰다:

귀하의 솔루션은 좋아 보입니다. @PM 2Ring. 그러나 추가 질문이 있습니다. 파일은 실제로 다음과 같습니다.

// 
abcdefghijklmnopqrstu 
//            x   x 
abcdefghijklmnopqrstu 
//          x   x 
abcdefghijklmnopqrstu 

따라서 이름은 첫 번째 줄에 완벽하게 삽입되지만 두 번째 / 쌍 이후에는 줄 끝의 x 뒤에 이름이 삽입됩니다. // 뒤에 이름을 삽입해야 하지만 나머지 텍스트를 오른쪽으로 이동하면 안 됩니다. 이름에 있는 문자 수만큼 공백을 제거할 수 있나요? 물론 첫 번째 줄에서는 이 작업을 수행하면 안 됩니다. 이렇게 하면 두 번째 줄의 문자가 제거될 것이라고 생각하기 때문입니다.

답변1

다음 방법으로 쉽게 이 작업을 수행할 수 있습니다 awk.

awk 'BEGIN{n=1}; /\/\//{$0=$0 " Text " n; n+=1}; {print}' infile

infile다음을 포함하는 경우

//
abcdefghijklmnopqrst
//
abcdefghijklmnopqrst
//
abcdefghijklmnopqrst

위 명령이 인쇄됩니다.

// Text 1
abcdefghijklmnopqrst
// Text 2
abcdefghijklmnopqrst
// Text 3
abcdefghijklmnopqrst

이상해 보이는 것은 /\/\//awk에서 정규 표현식이 슬래시로 구분된다는 점입니다. 정규 표현식에 슬래시를 넣으려면 백슬래시로 이스케이프 처리해야 합니다.RegEx///\

전혀,무늬{행동}는 실행을 의미합니다.행동현재 줄이 일치하는 경우무늬. 이 BEGIN모드는 행을 읽기 전에 발생하려는 작업을 나타내는 특수 모드입니다. 패턴을 지정하지 않으면 모든 행에서 작업이 수행됩니다(이를 재정의할 수 있는 방법이 있음).


이 업데이트된 버전은 새 입력 파일에서 작동하지만 안타깝게도 공백이 유지되지 않습니다.

awk 'BEGIN{n=1}; /^\/\//{$1=$1 " Text " n; n+=1}; {print}' infile

입력하다

// x  x
abcdefghijklmnopqrst
//    x    x
abcdefghijklmnopqrst
//          x   x
abcdefghijklmnopqrst

산출

// Text 1 x x
abcdefghijklmnopqrst
// Text 2 x x
abcdefghijklmnopqrst
// Text 3 x x
abcdefghijklmnopqrst

답변2

및 평가 플래그를 사용하여 perl대체 섹션에서 변수를 증가시킬 수 있습니다. 숫자로 시작 //하고 Text그 뒤에 숫자를 추가하는 모든 줄을 검색합니다.

perl -pe 's{\A(//)}{$1 . " Text " . ++$i}e' File_1.txt

그것은 다음을 생산합니다 :

// Text 1 
abcdefghijklmnopqrst
// Text 2 
abcdefghijklmnopqrst
// Text 3  
abcdefghijklmnopqrst

고쳐 쓰다(의견 참조):

다음 공간을 그룹화 //하고 교체 부품에 삽입할 공간 수를 계산합니다. 예:

perl -pe 's{\A(//)(\h*)}{$1 . " Text " . ++$i . " " x ((length ($2)) - length(" Text " . $i))}e' temp

마지막 예제를 사용하면 다음이 생성됩니다.

// Text 1
abcdefghijklmnopqrstu 
// Text 2     x   x 
abcdefghijklmnopqrstu 
// Text 3   x   x
abcdefghijklmnopqrstu

답변3

@Birei의 솔루션을 "추가 문제" 업데이트로 변환:

perl -pe 's{^// {10}}{sprintf("// Text %-3d ",++$i)}e  or
          s{^//     }{sprintf("// Text %d",   ++$i)}ex '          infile

관련 정보