![sed를 사용하여 파일의 지정된 문자열을 다른 파일의 문자열로 대체](https://linux55.com/image/194386/sed%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EC%A7%80%EC%A0%95%EB%90%9C%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EB%8B%A4%EB%A5%B8%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EB%AC%B8%EC%9E%90%EC%97%B4%EB%A1%9C%20%EB%8C%80%EC%B2%B4.png)
그런 파일이 두 개 있습니다.
파일 1
line 1
line 2
... (more lines)
aaa PLACEHOLDER bbb ccc
... (more lines)
ddd PLACEHOLDER eee fff
... (more lines)
etc
파일 2
NEWTEXT1
NEWTEXT2
... (more lines)
file2의 NEWTEXT 문자열 수는 항상 file1의 PLACEHOLDER를 포함하는 줄 수와 동일합니다. PLACEHOLDER 문자열이 file1의 어느 줄에 있는지 알 수 없으며, PLACEHOLDER 문자열의 수는 file1 및 file2 파일 세트마다 다를 수 있습니다.
각 PLACEHOLDER를 파일 2의 해당 문자열로 바꾸고 싶습니다. 따라서 이 예의 경우 새 파일은 다음과 같습니다.
line 1
line 2
... (more lines)
aaa NEWTEXT1 bbb ccc
... (more lines)
ddd NEWTEXT2 eee fff
... (more lines)
etc
sed를 사용하여 이를 달성할 수 있습니까? 감사해요.
답변1
나는 다음을 사용할 것이다 perl
:
perl -pe '
s{PLACEHOLDER}{
$replacement = <STDIN>;
chomp $replacement;
$replacement
}ge' file1 < file2
PLACEHOLDER
또한 한 줄에 여러 번 교체할 수 있습니다.
답변2
GNU sed
스트림 편집기를 사용하여 자리 표시자 줄 아래에 file2의 새 텍스트 줄을 배치하고 다음 sed 호출에 이를 결합할 수 있습니다.
sed -e '/PLACEHOLDER/R file2' file1 |
sed -Ee '
/PLACEHOLDER/N
s/PLACEHOLDER(.*)\n(.*)/\2\1/
' -
결과:-
line 1
line 2
... (more lines)
aaa NEWTEXT1 bbb ccc
... (more lines)
ddd NEWTEXT2 eee fff
... (more lines)
etc
위 내용의 한 줄 버전:
$ sed -e '/PLACEHOLDER/R file2' file1 | sed -Ee '/PLACEHOLDER/N;s/PLACEHOLDER(.*)\n(.*)/\2\1/' -