sed를 사용하여 HTML 축소에서 사전 태그를 제외하는 방법은 무엇입니까?

sed를 사용하여 HTML 축소에서 사전 태그를 제외하는 방법은 무엇입니까?

다음을 사용하여 HTML을 축소하려고 합니다.sed

<pre>내 문제: 태그 안의 어떤 것도 축소하고 싶지 않지만 작동하게 할 수 없습니다.

이것이 내가 사용하는 것입니다:

sed ':a;N;$!ba;s@>\s*<@><@g' $html_file > ${html_file//.html/.minhtml}

이렇게 하면 pre 태그 안의 콘텐츠를 포함한 모든 내용이 축소됩니다.

사용해봤는데 ^[pre]작동이 안되네요...

나는 또한 다음을 사용하여 보았습니다 sed /skipme/! s/foo/bar/.

sed ':a;N;$!ba; /<pre>\.*<\/pre>/! s@>\s*<@><@g' $html_file > ${html_file//.html/.minhtml}

sed(...네, 다른 도구 대신 그걸로 고수하고 있어요 . 감사합니다.)

답변1

정규식은 HTML 구문 분석에 잘못된 도구이고 스크립트를 실패하게 만드는 극단적인 경우를 만들기 쉽다는 것을 알고 있지만 잘못된 도구를 사용하려고 고집하십니까? 괜찮은.

적용되는 사례를 살펴보겠습니다.

  • 미리 서식이 지정된 텍스트가 없는 줄( 이라고 함 pre)
  • 한 줄 pre,
  • 일부는 pre한 줄로,
  • pre여러개가 연속으로 있는데,
  • 한 줄 이상 pre이라도
  • pre이전 줄이 끝난 줄에서 시작합니다 pre.

이러한 모든 사례는 이 샘플 파일에 있습니다.

<x>    </x>
<pre>_ _</pre>
_ <pre>_</pre> _<x>    </x>_
_ <pre>_</pre> _<x>    </x> _ <pre>_</pre> _
_ <pre>_<x>    </x>_
_</pre> _
_<x>    </x>_<x>    </x>_
_ <pre>_
_<x>    </x>_<x>    </x>_
_</pre> _ <pre>
_
<x>    </x>_
</pre>

축소되는 부분이 여러 번 구현되는 것을 방지하기 위해 첫 번째 단계에서 분리 pre및 비선형성을 수행해 보겠습니다.pre

sed -z -e 's/<pre>/\n&/g;s_</pre>_&\n_g'

(분명히 GNU를 사용하고 있습니다 sed. 그렇지 않으면 :a;N;$!ba;작동하지 않습니다. 그러나 GNU의 경우 해당 코드를 제거하고 옵션을 사용할 수 있습니다.) 이제 이 코드 는 sed각 . -z1초로 설정하면 처리해야 할 경우가 훨씬 적어집니다(그리고 줄 바꿈은 외부에 해를 끼치지 않습니다).<pre></pre>sed<pre>

sed -e '\_<pre>.*</pre>_b' -e '/<pre>/,\_</pre>_!s/>\s*</></g'

첫 번째 부분은 pre한 줄 내용의 경우 스크립트 끝으로 이동하고, 두 번째 부분은 !여러 줄() 을 제외한 나머지 줄을 줄입니다 pre.

함께,

sed -z -e 's/<pre>/\n&/g;s_</pre>_&\n_g' file.html | sed -e '\_<pre>.*</pre>_b' -e '/<pre>/,\_</pre>_!s/>\s*</></g'

생산하다

<x></x>

<pre>_ _</pre>

_ 
<pre>_</pre>
 _<x></x>_
_ 
<pre>_</pre>
 _<x></x> _ 
<pre>_</pre>
 _
_ 
<pre>_<x>    </x>_
_</pre>
 _
_<x></x>_<x></x>_
_ 
<pre>_
_<x>    </x>_<x>    </x>_
_</pre>
 _ 
<pre>
_
<x>    </x>_
</pre>

그리고 – 짜잔 – 외부 공간은 제거되었지만 pre내부는 그대로 유지되었습니다.

답변2

sed ':a;$!{N;ba;};s/@/@a/g;s/\n/@n/g;s/<pre/\n&/g;s/<\/pre>/&\n/g' test.html \
  | sed -r '/(^<pre|<\/pre>$)/!{s/@n//g;s/>\s+</></g;}' \
  | sed ':a;$!{N;ba;};s/\n//g;s/@n/\n/g;s/@a/@/g' >min.html

~에서sed 스크래치-sed 예제 모음.

관련 정보