많은 정적 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" {} \;