sed를 사용하여 파일의 지정된 문자열을 다른 파일의 문자열로 대체

sed를 사용하여 파일의 지정된 문자열을 다른 파일의 문자열로 대체

그런 파일이 두 개 있습니다.

파일 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/' -

관련 정보