다음과 같은 파일이 있습니다.
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에서 정규 표현식이 슬래시로 구분된다는 점입니다. 정규 표현식에 슬래시를 넣으려면 백슬래시로 이스케이프 처리해야 합니다.Reg
Ex
//
/
\
전혀,무늬{행동}는 실행을 의미합니다.행동현재 줄이 일치하는 경우무늬. 이 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