나는배시 쉘 스크립트일부 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
그래서 저는 디렉터리에 있는 모든 HTML 파일에 대해 이 명령을 실행하기 위해 find
제가 사용하는 것과 동일한 기능을 수행하고 여기에 해당 방법을 적용할 수 있다고 생각했습니다.sed
awk
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}'