다음을 사용하여 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
각 . -z
1초로 설정하면 처리해야 할 경우가 훨씬 적어집니다(그리고 줄 바꿈은 외부에 해를 끼치지 않습니다).<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