sed/awk를 사용하여 파일의 특정 줄 뒤의 모든 텍스트를 다른 텍스트 파일의 내용으로 바꾸는 방법은 무엇입니까?

sed/awk를 사용하여 파일의 특정 줄 뒤의 모든 텍스트를 다른 텍스트 파일의 내용으로 바꾸는 방법은 무엇입니까?

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

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

이 파일은 "이 줄 뒤의 모든 항목 바꾸기" 이후의 모든 텍스트를 삭제하고 파일의 텍스트로 바꾸는 방식으로 업데이트됩니다.file.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세 번째 블록에서는 현재 라인이 종료되기 전에 출력되지만(이것은 읽은 샘플 데이터의 라인이 됩니다 ), call 사용 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

관련 정보