Bash를 사용하여 파일에서 "증분"교체를 수행하는 방법

Bash를 사용하여 파일에서 "증분"교체를 수행하는 방법

특정 패턴(예: )이 있는 파일을 디렉터리에서 검색하여 foobar로 바꿔야 합니다 foobarXXX. 여기서 XXX은 숫자입니다. 예를 들어 원본 파일이 두 개 있습니다.

snt130.txt

내 여주인의 눈은 전혀 닮지 않았어푸바;
푸바그녀의 입술의 붉은색보다 더 붉다.

snt18.txt

당신을 여름날에 비유해도 될까요?
네가 더 귀엽고 귀여워푸바:

처리 후에는 다음과 같은 것이 필요합니다(숫자의 순서는 중요하지 않으며 고유성만 필요합니다).

snt130.txt

내 여주인의 눈은 전혀 닮지 않았어foobar001;
foobar002그녀의 입술의 붉은색보다 더 붉다.

snt18.txt

당신을 여름날에 비유해도 될까요?
네가 더 귀엽고 귀여워foobar003:

이 검색 및 바꾸기 작업을 수행하는 가장 쉬운 방법은 무엇입니까(사용하는 것이 가장 좋음 bash)

답변1

$ cat f1
My mistress' eyes are nothing like foobar;
foobar is far more red than her lips' red;
$ cat f2
Shall I compare thee to a summer's day?
Thou art more lovely and more foobar:

그리고perl

$ perl -i -pe 's/foobar\K/sprintf "%03d", ++$i/ge' f1 f2
$ cat f1
My mistress' eyes are nothing like foobar001;
foobar002 is far more red than her lips' red;
$ cat f2
Shall I compare thee to a summer's day?
Thou art more lovely and more foobar003:
  • 0숫자 컨텍스트에서 초기화되지 않은 변수의 기본값
  • eModifier를 사용하면 교체 부품에 Perl 코드를 사용할 수 있습니다.
  • foobar\K교체할 문자열은 \K편의상 여기에 있습니다.


gawk내부 확장이 있으며 한 줄에 하나의 문자열 인스턴스만 가정합니다 .

gawk -i inplace -v s='foobar' '$0 ~ s{sub(s, sprintf("%s%03d", s, ++i))} 1' f1 f2

관련 정보