나는파일 1.html:
<!doctype html>
<html>
<head>
</head>
<body>
text
<!-- start-replacing -->
<p>more text1</p>
<p>more text2</p>
<!-- end-replacing -->
other text
</body>
</html>
그리고파일 2.txt
<p>some text</p>
<div>some other text</div>
이제 나는 사이의 모든 것을 대체하는 명령을 찾고 있습니다.
<!-- start-replacing -->
그리고<!-- end-replacing -->
file2.txt의 내용으로
이것출력.html해야 한다:
<!doctype html>
<html>
<head>
</head>
<body>
text
<!-- start-replacing -->
<p>some text</p>
<div>some other text</div>
<!-- end-replacing -->
other text
</body>
</html>
답변1
그리고 perl
:
perl -0777 -pe '
BEGIN{$repl = <STDIN>}
s/<!-- start-replacing -->\K.*?(?=<!-- end-replacing -->)/$repl/sg
' file1.html < file2.txt > output.html
답변2
그리고 GNU sed
:
sed -e '/<!-- end-replacing -->/e cat file2.txt' -e '/<!-- start-replacing -->/,//{//!d}' file1.html
이 명령은 끝 주소 범위에서 외부 명령을 e
호출하는 데 사용됩니다 . cat file2.txt
파일 내용은 일치하는 줄 앞에 삽입됩니다.
그런 다음 주소 범위 사이의 줄을 삭제합니다. //
사용된 마지막 정규식을 나타냅니다(쉼표 뒤의 끝 범위와 {}
블록 내의 두 주소).
답변3
사용sed
$ sed -Ee '/start-replacing/{{r file2.txt' -e '};n;:a;N;s/.*\n(.*end-replacing[^\n]*\n)/\1/;ba}' file1.html
<!doctype html>
<html>
<head>
</head>
<body>
text
<!-- start-replacing -->
<p>some text</p>
<div>some other text</div>
<!-- end-replacing -->
other text
</body>
</html>
답변4
W3CHTML-XML-utils
HTML 인식 및/또는 XML 인식. 이것hxincl
패키지의 유틸리티는 html-xml-utils
포함된 특정 주석을 확장하거나 makefile
포함된 파일에 따라 달라지는 규칙 목록을 인쇄합니다.
hxincl -s incfnm='file2.txt' file1.html
약간 수정된 입력이 주어지면 원하는 출력을 생성합니다.
<!-- begin-include "incfnm" -->
<p>more text1</p>
<p>more text2</p>
<!-- end-include "incfnm" -->