![Bash를 사용하여 파일에서 "증분"교체를 수행하는 방법](https://linux55.com/image/120976/Bash%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%22%EC%A6%9D%EB%B6%84%22%EA%B5%90%EC%B2%B4%EB%A5%BC%20%EC%88%98%ED%96%89%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
특정 패턴(예: )이 있는 파일을 디렉터리에서 검색하여 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
숫자 컨텍스트에서 초기화되지 않은 변수의 기본값e
Modifier를 사용하면 교체 부품에 Perl 코드를 사용할 수 있습니다.foobar\K
교체할 문자열은\K
편의상 여기에 있습니다.
gawk
내부 확장이 있으며 한 줄에 하나의 문자열 인스턴스만 가정합니다 .
gawk -i inplace -v s='foobar' '$0 ~ s{sub(s, sprintf("%s%03d", s, ++i))} 1' f1 f2