현재 원본_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번째 줄부터 특별한 내용이 있는 줄까지 모든 줄을 인쇄합니다. 이 줄을 명시적으로 인쇄한
p
다음d
새 루프("print; next
" inawk
)를 강제로 시작하도록 호출합니다. - 첫 번째 블록이 초기 라인을 출력한 후 두 번째 블록은 추가 파일의 내용을 출력합니다.
- 그런 다음 편집 스크립트가 종료됩니다.
일반적으로 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