일치하는 파일 경로를 sed 경로의 파일 콘텐츠로 바꿉니다.

일치하는 파일 경로를 sed 경로의 파일 콘텐츠로 바꿉니다.

javascript 파일의 내용을 단일 html 파일에 입력하는 짧은 배포 스크립트를 작성하고 싶습니다. 이러한 js 파일은 현재 다음과 같이 선언됩니다.

  <script src="js/jquery-1.8.2.js"></script>
  <script src="js/jquery.rotate-2.2.js"></script>
  <script src="js/underscore.js"></script>
  <script src="js/backbone.js"></script>
  <script src="js/backbone.dualstorage.js"></script>
  <script src="js/favourites.js"></script>
  <script src="js/menuItem.js"></script>
  <script src="js/companies.js"></script>
  <script src="js/lectures.js"></script>
  <script src="js/banquette.js"></script>
  <script src="js/menu.js"></script>
  <script src="js/application.js"></script>
  <script src="js/main.js"></script>

내가 원하는 것을 거의 수행하는 다음 sed 스크립트가 있습니다.

sed -r -e '/<script src="(.*)">/r \1' -e '/<script src="(.*)">/d' index.html

위 입력으로 이 sed 명령을 실행한 결과는 빈 문자열입니다. \1의 어느 부분이 실패하는지 잘 모르겠습니다. s 명령 외부에서는 인용이 작동하지 않기 때문입니까?

달리기:

sed -r -e 's/<script src="(.*)">/\1/'

결과 :

js/jquery-1.8.2.js</script>
js/jquery.rotate-2.2.js</script>
js/underscore.js</script>
And so on ...

정규식이 올바른 항목과 일치하는 것은 분명합니다.

경로가 올바르지 않은지 확인하기 위해 첫 번째 명령의 \1에 포함된 내용을 디버깅하는 방법이 있습니까?

답변1

그러나 실제로는 그렇지 않습니다. 말씀하신 대로 역참조는 command 외부에서는 작동하지 않습니다 s.

awk나 Perl을 사용하여 이 작업을 수행할 수 있습니다.

perl -pe 's{<script src="(.*?)">}{
  local$/;open F,"<$1";"<script>".<F>}ge'

답변2

GNU sed e명령이 해결책이 될 수 있습니다.

sed '
/<script src="/ {
  s/.*<script src="\([^"]\+\)">.*/cat \1/
  e
  }
' index.html

e인수가 없으면 패턴 공간의 내용이 명령으로 실행되므로 cat js/foobar.js이를 수행하는 트릭과 마찬가지로 일치하는 행이 쉘 명령으로 다시 작성됩니다. 명령의 출력은 패턴 공간을 대체합니다.

관련 정보