sed를 사용하여 여러 파일의 자바스크립트 코드 바꾸기

sed를 사용하여 여러 파일의 자바스크립트 코드 바꾸기

많은 정적 HTML 파일에서 기존 Google Analytics 코드를 새로운 범용 추적 코드로 교체해야 합니다. 이전 코드는 다음과 같습니다.

_uacct = "UA-XXXXXX-X";
urchinTracker();

새로운 코드는 다음과 같습니다:

(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');ga('create', 'UA-XXXXXX-X', 'xxx.com');ga('require', 'displayfeatures');ga('send', 'pageview');

bash find 명령을 sed(CentOS 6)와 결합하려고 합니다.

find docs/ -type f -iname "*.html" -exec sed -i ':a;N;$!ba;s/_uacct = "UA-XXXXXX-X";\nurchinTracker();/(function(i,s,o,g,r,a,m){i[\'GoogleAnalyticsObject\']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,\'script\',\'\/\/www.google-analytics.com\/analytics.js\',\'ga\');ga(\'create\', \'UA-XXXXXX-X\', \'xxx.com\');ga(\'require\', \'displayfeatures\');ga(\'send\', \'pageview\');/g' {} \;

그러나 이로 인해 다음 오류가 발생합니다.

-bash: syntax error near unexpected token `('

몇 가지 연구 끝에 대괄호도 이스케이프 처리해야 한다는 사실을 발견했습니다.

find arts/ -type f -iname "bass.html" -exec sed -i ':a;N;$!ba;s/_uacct = "UA-XXXXXX-X";\nurchinTracker();/\(function\(i,s,o,g,r,a,m\){i[\'GoogleAnalyticsObject\']=r;i[r]=i[r]||function\(\){\(i[r].q=i[r].q||[]\).push\(arguments\)},i[r].l=1*new Date\(\);a=s.createElement\(o\),m=s.getElementsByTagName\(o\)[0];a.async=1;a.src=g;m.parentNode.insertBefore\(a,m\)}\)\(window,document,\'script\',\'\/\/www.google-analytics.com\/analytics.js\',\'ga\'\);ga\(\'create\', \'UA-XXXXXX-X\', \'xxx.com\'\);ga\(\'require\', \'displayfeatures\'\);ga\(\'send\', \'pageview\'\);/g' {} \;
> 
> 

보시다시피 bash는 무언가가 이스케이프되지 않았다고 생각하여 줄을 끊고 명령을 실행하지 않습니다.

내가 뭘 잘못했나요?

다른 도구(예: awk)를 사용하여 이 작업을 수행할 수 있다면?

답변1

작은따옴표 안에 작은따옴표를 이스케이프 처리할 수 없습니다.. 가장 쉬운 방법은 스크립트를 파일에 넣고 실행하는 것입니다.

find arts/ -type f -iname "bass.html" -exec sed -i -f your-script.sed '{}' \;

답변2

이것은 나에게 효과적입니다

find docs/ -type f -iname "*.html" -exec \
perl -i.bak -0pe 's/_uacct = "UA-XXXXXX-X";\nurchinTracker\(\);/test/igs' {} \;

문제가 발생할 경우를 대비해 -i.bak원본 파일의 복사본이 확장명으로 생성됩니다 . .bak이제 대체되는 것은 string 입니다 test. 긴 대안으로 교체하십시오.

거대한 대체품을 사용하면 다음과 같습니다.

find docs/ -type f -iname "*.html" -exec perl -i.bak -0pe "s/_uacct = \"UA-XXXXXX-X\";\nurchinTracker\(\);/\(function\(i,s,o,g,r,a,m\)\{i\['GoogleAnalyticsObject'\]=r;i\[r\]=i\[r\]\|\|function\(\)\{\(i\[r\].q=i\[r\].q\|\|\[\]\).push\(arguments\)\},i\[r\].l=1\*new Date\(\);a=s.createElement\(o\),m=s.getElementsByTagName\(o\)\[0\];a.async=1;a.src=g;m.parentNode.insertBefore\(a,m\)\}\)\(window,document,'script','\/\/www.google-analytics.com\/analytics.js','ga'\);ga\('create', 'UA-XXXXXX-X', 'xxx.com'\);ga\('require', 'displayfeatures'\);ga\('send', 'pageview'\);/igs" {} \;

관련 정보