이 awk 명령이 sed처럼 find에서 잘 재생되지 않는 이유는 무엇입니까?

이 awk 명령이 sed처럼 find에서 잘 재생되지 않는 이유는 무엇입니까?

나는배시 쉘 스크립트일부 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제가 사용하는 것과 동일한 기능을 수행하고 여기에 해당 방법을 적용할 수 있다고 생각했습니다.sedawk

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}'

관련 정보