다음과 같이 두 개의 html 태그 사이에 있는 개행 문자를 제거하고 싶습니다.
<font>
</font>
개행 문자를 제거하여 다음과 같이 만들고 싶습니다.
<font></font>
또한 어떤 경우에는 여러 줄 바꿈이 있을 수 있습니다.
<font>
</font>
또한 다음과 같이 제거하고 싶습니다.
<font></font>
또 다른 장면,
패턴이 다음과 같은 경우:
<font>
This is a text
</font>
변환 후에는 다음과 같아야 합니다.
<font>This is a text</font>
위의 모든 경우는 잘라내기만 하면 해결될 수 있습니다.오직두 개의 HTML 태그 사이에 줄 바꿈이 있습니다. 우리는 어떠한 격차도 고려해서는 안 됩니다.
sed를 사용하여 이를 찾을 수 있는 몇 가지 방법이 있지만 특히 파일에 1000개 이상의 html 태그가 있는 경우 시간이 많이 걸리고 성능 효율적입니다.
답변1
이 sed
명령은 다음 작업에 도움이 됩니다.
sed -e ':1;/<font>[[:space:]]*$/{N;s#<font>[[:space:]]\+</font>#<font></font>#g;b1}' file
<font>
이 명령은 토큰과 줄 끝까지의 공백을 찾습니다 . 그런 다음 다음 줄을 패턴 공간으로 가져오고 가능한 시퀀스를 모두 교체한 다음 <font>[[:space:]]\+</font>
스크립트를 처음부터 다시 시작합니다. 패턴 공간이 주소와 일치하지 않는 경우 /<font>[[:space:]]*$/
, 즉 mark 뒤에 공백이 아닌 내용이 있는 <font>
경우 패턴 공간이 인쇄되고 지워지고 end of sed script
프로세스가 다시 시작됩니다.
편집하다: 성능 측정.
나는 다음 내용으로 파일을 채웠고 10,000번 반복했습니다.
<font>
dejidewji
</font>
<font>
</font><font>
</font>
총 620Kb. 1.4Gz A8-4500M에서 위 스크립트의 타이밍은 다음과 같습니다.
real 0m0.361s
user 0m0.356s
sys 0m0.005s
편집 2:
마지막 문제 업데이트는 해결하기 쉽고 perl
다른 답변에서 볼 수 있듯이 성능이 10배 향상되었습니다.
perl -0777 -pe 's|<font>\s+|<font>|g;s|\s+</font>|</font>|g' file
크레딧 @spasic
답변2
$ cat ip.html
<font>
This is a text
</font>
123
<font>
</font>
xyz
<font>
</font>
ijk
<font>
</font>
789
perl
해결책, -0777
전체 파일을 삼키십시오
$ perl -0777 -pe 's|<font>\n*([^\n]*)\n*</font>|<font>$1</font>|g' ip.html
<font>This is a text</font>
123
<font></font>
xyz
<font></font>
ijk
<font></font>
789