나는배시 쉘 스크립트일부 HTML 파일에 대해 일부 파일 작업을 수행합니다.
sed
내가 하는 많은 일 중에서 정말 잘 작동하는 명령이 있습니다 .
find $DIR -type f -name '*.html' -exec sed -i 's/.*<script type="text\/javascript" charset="utf-8" src="file.js"><\/script>.*/<script type="text\/javascript" charset="utf-8" src="file2.js"><\/script>/g' {} \;
해당 디렉토리의 각 HTML 파일을 확인하고 텍스트 줄을 바꿉니다.
비슷한 작업을 수행하고 싶습니다. 두 HTML 주석 사이에 여러 줄을 바꾸십시오.
그래서 나는 이것을 취하고 싶습니다 :
<!-- STARTREPLACE1 -->
Blah
Blah
Blah
<!-- ENDREPLACE1 -->
다음과 같이 변경합니다.
<!-- STARTREPLACE1 -->
A whole new world!
<!-- ENDREPLACE1 -->
awk
파일에서 실행될 때 작동하는 것으로 보이는 다음 명령을 찾았습니다 .
awk '/<!-- STARTREPLACE1 -->/{p=1;print;print "A whole new world!"}/<!-- ENDREPLACE1 -->/{p=0}!p' justonefile.html
그래서 저는 find
제가 사용한 것과 동일한 기능을 수행 sed
하고 여기에 있는 방법을 적용하여 awk
디렉터리의 모든 HTML 파일에 대해 이 명령을 실행할 수 있다고 생각했습니다.
find $DIR -type f -name '*.html' -exec awk '/<!-- STARTREPLACE1 -->/{p=1;print;print "A whole new world!"}/<!-- ENDREPLACE1 -->/{p=0}!p'
하지만 실행하면 다음과 같이 표시됩니다.
find: `-exec' no such parameter
모든 HTML 파일에서 awk 명령을 실행하는 방법이 있습니까?
보너스 질문:바꾸려는 텍스트를 둘러싼 두 개의 태그도 제거할 수 있나요? 따라서 <!-- STARTREPLACE1 -->
및가 <!-- ENDREPLACE1 -->
제거되면 다음과 같이 끝납니다.
A whole new world!
답변1
먼저 -exec
작업을 종료 해야 합니다 {} \;
.
둘째, 파일을 그 자리에서(옵션 사용) 수정하지 마십시오 awk
. 따라서 출력을 임시 파일로 보낸 다음 원본 파일로 이동해야 합니다.sed
-i
replace
다음 내용으로 스크립트를 만듭니다(예를 들어 그렇게 부르자).
#!/bin/sh
tfile=$(mktemp)
awk '/<!-- STARTREPLACE1 -->/{p=1;print;print "A whole new world!"}
/<!-- ENDREPLACE1 -->/ {p=0}' "$1" >"$tfile" && \
mv "$tfile" "$1"
실행 권한을 부여하세요
chmod +x ./replace
그런 다음 실행
find "$DIR" -type f -iname '*.html' -exec ./replace {} \;
답변2
그리고 보너스:
gawk '{!p} /<!-- STARTREPLACE1 -->/{print "A whole new world!";p=1}/<!-- ENDREPLACE1 -->/{p=0}'