두 개의 특정 줄 내에서 내용 바꾸기

두 개의 특정 줄 내에서 내용 바꾸기

<!-- 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

  • spongemoreutils다음과 같이 패키지에서 사용하십시오 .

    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' 

관련 정보