<!-- Analytics code start -->
명령줄 사이 에서 <!-- Analytics code end -->
내용을 바꾸는 방법 index.html
:
<html>
...
<!-- Analytics code start -->
...
<!-- Analytics code end -->
</body>
</html>
파일 내용으로 myanalytics.txt
?
참고: 많은 파일에 대해 이 작업을 수행해야 하기 때문에 명령줄을 통해 이 작업을 수행하고 싶습니다.
답변1
해결책은 다음 awk
과 같습니다.
awk '/Analytics code start/ { t=1; print; system("cat myanalytics.txt") }
/Analytics code end/ { t=0 }
t==0 { print } ' index.html
(가독성을 높이기 위해 코드를 들여썼지만 쉽게 한 줄이 될 수도 있습니다)
간략한 설명:
t==0
항상 현재 줄을 인쇄할 때- 현재 줄이
"Analytics code start"
설정과 일치 하면t==1
현재 줄과 필요한 파일을 인쇄합니다.system("cat myanalytics.txt")
- Now
t
는 와 같으1
므로 현재 줄은 인쇄되지 않지만, 현재 줄이 와 일치하면"Analytics code end"
다시t
로 설정되므로0
지금부터 현재 줄이 인쇄됩니다.
노트:
파일은 편집되지 않습니다 index.html
. 수정하려면 index.html
다음을 수행할 수 있습니다.
출력을
awk
임시 파일로 리디렉션한 다음mv
또는 같은 명령을 사용합니다.cp
sponge
moreutils
다음과 같이 패키지에서 사용하십시오 .awk '[.. commands like above ..]' index.html | sponge index.html
답변2
상황에 따라 다음과 같이 할 수 있습니다.
#!/bin/sh
SOURCE=index.html
if ! test -f "$SOURCE"; then
echo source is missing >&2
exit 1
fi
headLimit=`grep -n '<!-- Analytics code start -->' "$SOURCE" | cut -d: -f1`
tailLimit=`grep -n '<!-- Analytics code end -->' "$SOURCE" | cut -d: -f1`
linennr=`awk '{}END{print NR + 1}' $SOURCE`
if ! test "$headLimit" -gt 0 -a "$tailLimit" -gt 0 >/dev/null; then
echo something is wrong >&2
exit 2
fi
(
head -n$headLimit "$SOURCE"
echo "the stuff I want to inject in place of my analytics code"
tail -n`expr $linennr - $tailLimit` "$SOURCE"
) >"$SOURCE.new"
if test -s "$SOURCE.new"; then
mv "$SOURCE" "$SOURCE.old"
mv "$SOURCE.new" "$SOURCE"
fi
exit 0
모든 ed
솔루션 기반 솔루션을 사용하면 대체 파일을 생성하는 대신 파일 내 콘텐츠를 실제로 대체할 수 있습니다. 이는 틀림없이 더 깔끔합니다.
답변3
나는 이것이 효과가 있을 것이라고 생각했다
sed -rn '/<!-- Analytics code start -->/{
p; :X n; /<!-- Analytics code end -->/{p;b}; bX
}; p'