
나는 파일 로 <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
특수 문자로 처리하려고 시도하며 동작은 다음과 같습니다.한정되지 않은:
( '\' ) 앞에 오는 일반 문자의 해석은 다음을 제외하고 정의되지 않습니다.
- 문자 ')', '(', '{' 및 '}'
- 1부터 9까지의 숫자(참조:여러 문자와 일치하는 BRE)
- 대괄호 표현식 안의 문자
따라서 이스케이프하지 않고 <
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