sed 정규식 특수 문자 제거

sed 정규식 특수 문자 제거

HTML 형식의 텍스트에서 가져온 여러 문자열이 포함된 파일이 있으므로 콘솔 인터페이스에서 보기 좋지 않은 일부 HTML 시퀀스가 ​​있습니다. 예는 다음과 같습니다.

Text1™
[Text®2]
Text:3

내가 시도하는 것은 & 와 사이의 모든 것을 제거하는 것입니다. 그러면 다음과 같이 텍스트를 다시 읽을 수 있습니다.

Text1
Text2
Text3

실제로 sed를 사용하여 추가 문자를 제거하려고 합니다.

sed 's#&*;##g' <file>

문제는 ; 텍스트 문자열에서.

그렇다면 문제는 추가 체인을 제거하기 위해 정규 표현식을 어떻게 코딩해야 하는가입니다.&#[1-9]+;

답변1

귀하의 정규식

sed 's#&*;##g' <file>

당신이 생각하는 대로 하지 않습니다. 문자 *는 앞의 문자가 0번 이상 반복된다는 것을 의미하는 승수입니다. 이전 문자는 &이므로 이는 예를 들어 &&&;and ;( &이전에 0 번 기록되었습니다 ;! 이것이 테스트 사례에서 일치하는 것입니다)와 일치하지만 이 경우에는 원하는 것과 일치하지 않습니다.

"를 지정해야 합니다.어느단일 점으로 표시되는 승수 앞에 문자"를 입력합니다 ..

$ echo 'Text&#58;3' | sed 's#&.*;##g'
Text3

그것이 첫 번째 문제였습니다. 두 번째는 소위 "탐욕스러운" 일치라는 개념입니다. sed첫 번째를 확인한 &다음 가능한 가장 큰 문자열을 일치시키려고 시도합니다. 한 줄에 여러 개의 HTML 엔터티가 있는 경우 다음과 같은 이유로 문제가 될 수 있습니다.

$ echo 'Text&#58;3 and some more text &aring; and end' | sed 's#&.*;##g'
Text and end

컨텍스트에서 수정 사항을 보려면 sed"~ 아니다 ;"를 닫기 전에 다음을 ;수행합니다.

$ echo 'Text&#58;3 and some more text &aring; and end' | sed 's#&[^;]*;##g'
Text3 and some more text  and end

&텍스트에서 앰퍼샌드 기호( )를 적법하게 사용하고 (글쎄, &amp;실제 "적법한" 사용이지만 실제 세계는 항상 이상적인 것만큼 구문 분석할 수 있는 것은 아닙니다) 너무 많이 일치하는 데에는 여전히 문제가 있습니다. 왜 sed그렇게 행동하는지.

답변2

코드를 실제 문자로 바꾸는 것이 더 좋지 않습니까?

echo 'Text1&#8482;
&#91;Text&#174;2&#93;
Text&#58;3' | perl -C -pe 's/&#([^;]*)/chr$1/eg'

산출:

Text1™;
[;Text®;2];
Text:;3

관련 정보