html 태그를 필터링하고 sed를 사용하여 다른 html 태그로 교체

html 태그를 필터링하고 sed를 사용하여 다른 html 태그로 교체

나는 파일 로 <B>and 을 (를) 대체하고 있었습니다. hmtl 태그를 교체하는 것과 다소 비슷합니다. 나는 . 작업을 수행했지만 파일에 있고 존재 하는 경우. 그런 다음 그들은 및 로 변경됩니다 . 나는 그 뒤에 논리를 이해하지 못합니다.</B><STRONG></STRONG>sed 's/\<B\>/STRONG/g'[B][/B][STRONG][/STRONG]

답변1

기본적으로 sed는 기본 정규식을 사용합니다. 이는 GNU가 \<단어의 시작 부분과 \>단어 끝 부분을 일치시킬 수 있다는 것을 의미합니다. 관찰하다:

$ echo '<B> BBB B' | sed 's/\<B\>/STRONG/g'
<STRONG> BBB STRONG

\<B\>B위 문자열에 두 번 나타나는 단어와 일치합니다 . 꺾쇠 괄호가 아닌 단어 B와 일치하므로 꺾쇠 괄호는 변경되지 않고 그대로 유지됩니다.

꺾쇠 괄호를 일치시키려면 <>백슬래시를 꺼두십시오.

$ echo '<B> BBB B' | sed 's/<B>/<STRONG>/g'
<STRONG> BBB B

<B>열린 꺾쇠 괄호와 B닫는 꺾쇠 괄호가 차례로 일치합니다. 따라서 <B>로 대체되었으나 <STRONG>그대로 B남아 있습니다.

여는 태그와 닫는 태그 모두 잡기

$ echo '<B> BBB B </B>' | sed -r 's|<(/)?B>|<\1STRONG>|g'
<STRONG> BBB B </STRONG>

-r확장 정규식을 위한 것이지만 최신 버전의 GNU sed도 -E의 동의어로 지원합니다 -r. BSD sed는 -E이를 위해 사용되며, 보도에 따르면 향후 POSIX 표준은 -E. 따라서 호환성을 위해 다음을 사용할 수 있습니다(모자 팁 @Kos).

$ echo '<B> BBB B </B>' | sed -E 's|<(/)?B>|<\1STRONG>|g'
<STRONG> BBB B </STRONG>

답변2

<>특수 문자가 아닙니다 .기본 정규식, 따라서 이스케이프되어서는 안 됩니다. 이스케이프 처리하면 sed특수 문자로 처리하려고 시도하며 동작은 다음과 같습니다.한정되지 않은:

( '\' ) 앞에 오는 일반 문자의 해석은 다음을 제외하고 정의되지 않습니다.

따라서 이스케이프하지 않고 <and 를 사용하세요.>

$ echo 'b<b>' | sed 's/<b>/strong/'  
bstrong

답변3

. awk​여기에 다음을 포함하는 두 줄의 샘플 파일이 있습니다.그리고gsub태그를 교체 하고 기능을 사용하세요 . 그런 다음 이를 임시 파일로 출력하고 다시 원본 파일로 되돌립니다. 완료되면 임시 파일을 제거하십시오. 필요에 따라 적응하십시오.

$ cat tags.txt                                                                                                                                      
<B> and </B>
<B> or </B>

$ awk '{gsub("<B>","<STRONG>"); gsub("</B>","</STRONG>");print}' tags.txt                                                                           
<STRONG> and </STRONG>
<STRONG> or </STRONG>

$ awk '{gsub("<B>","<STRONG>"); gsub("</B>","</STRONG>");print}' tags.txt > tmpfile.txt && cat tmpfile > tags.txt

관련 정보