sed/awk를 사용하여 파일의 특정 줄 뒤의 모든 텍스트를 다른 텍스트 파일의 내용으로 어떻게 바꾸나요?

sed/awk를 사용하여 파일의 특정 줄 뒤의 모든 텍스트를 다른 텍스트 파일의 내용으로 어떻게 바꾸나요?

현재 원본_file.txt라는 파일의 텍스트 업데이트를 자동화하려고 합니다. 파일이 다음과 같다고 상상해 보세요.

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
text_that_will
be_removed
after_the_command

이 파일은 "이 줄 뒤의 모든 항목 바꾸기" 뒤의 모든 텍스트를 제거하고 파일의 텍스트로 바꾸는 방식으로 업데이트됩니다.교체_파일.txt. 게시물의 내용을 위해 replacement_file.txt에 다음 텍스트가 있다고 가정해 보겠습니다.

testing123
this_is_the_replacement_text

sed로 찾은 것에서 특정 문구 뒤의 나머지 줄을 편집하는 방법만 알아낼 수 있습니다. 교체 문구 뒤의 Original_file.txt에 있는 텍스트를 replacement_file.txt의 모든 텍스트로 바꾸고 싶습니다(향후 업데이트를 위해 교체 줄 텍스트를 유지하고 싶습니다). Original_file.txt는 마지막에 다음과 같아야 합니다.

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text

미리 감사드립니다!

답변1

GNU/awk에서:

두 파일의 이름을 인수로 지정합니다.

awk '{ print; } /^### REPLACE EVERYTHING AFTER THIS LINE ###$/ { nextfile; }' fn1 fn2

답변2

"replace after" 줄이 발견될 때까지 모든 줄을 인쇄한 다음 다른 파일에서 읽고 종료합니다.

sed '/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{r replacement_file.txt
q;}' original_file.txt

  • sed -i변경 사항을 저장하는 데 사용
  • 또는... > tmp && mv tmp original

답변3

사용 sed:

sed -n -e '1,/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{ p; d; }' \
       -e 'r replacement_file.txt' \
       -e 'q' original_file.txt

sed블록은 다음과 같은 작업을 수행합니다.

  1. 첫 번째 블록은 1행부터 특수 내용이 있는 행까지 모든 행을 인쇄합니다. 이 줄을 명시적으로 인쇄 p한 다음 호출하여 d새 주기를 강제로 시작합니다(" print; next" in awk).
  2. 첫 번째 블록에서 초기 라인이 출력된 후 두 번째 블록은 추가 파일의 내용을 출력합니다.
  3. 그런 다음 편집 스크립트가 종료됩니다.

일반적으로 q세 번째 블록에서는 종료하기 전에 현재 라인을 출력하지만(이것은 데이터 읽기 예제의 라인이 됨 text_that_will) sed로 호출되므로 -n사이클이 끝날 때 라인의 기본 출력이 금지됩니다.

데이터가 주어진 경우 위 명령의 결과는 다음과 같습니다.

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text

원본 파일을 업데이트하려면 를 사용 sed -i ...하거나 출력을 새 파일로 리디렉션한 후 원본을 다음으로 바꿀 수 있습니다.

sed ... original_file.txt >original_file.txt.new &&
mv original_file.txt.new original_file.txt

답변4

Gnu Awk를 사용하는 경우:

awk '{print} /### REPLACE.../{system("cat replacement"); exit 0}' file

관련 정보