두 문자열 사이의 개행 문자를 제거하는 방법\N유닉스에서?

두 문자열 사이의 개행 문자를 제거하는 방법\N유닉스에서?

다음과 같이 두 개의 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

관련 정보