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
이를 수행하는 트릭과 마찬가지로 일치하는 행이 쉘 명령으로 다시 작성됩니다. 명령의 출력은 패턴 공간을 대체합니다.