XML 태그가 포함된 파일이 여러 개 있습니다. 예를 들면 다음과 같습니다.
<h> PIDAT <h> O
<h>
이 줄의 첫 번째 줄 이후의 모든 항목을 삭제해야 다음과 같은 결과를 얻을 수 있습니다.
<h>
이를 위해 나는 사용하고 있습니다
sed -i -e 's/(^<.*?>).+/$1/' *.conll
하지만 sed는 이를 인식하지 못하는 것 같습니다 $1
. (제가 아는 한, $1
그룹에 포함되지 않은 모든 항목은 삭제되어야 합니다.) 이것을 달성할 수 있는 방법이 있나요? 올바른 방향을 알려주시면 정말 감사하겠습니다.
추신: 정규 표현식 애플리케이션에서 이러한 표현식을 테스트했는데 작동하지만 명령줄에서는 작동하지 않습니다.
답변1
sed
역참조는 Perl과 더 유사한 \1
등 \2
의 형식을 취합니다 . 또한 BRE(기본 정규 표현식)를 사용하는 경우 및 및 그룹을 형성하는 괄호를 $1
이스케이프해야 합니다 . 또는 옵션과 함께 확장 정규식을 사용할 수 있습니다 .(...)
?
+
-E
sed 정규식은 탐욕적이므로 첫 번째 줄에서 멈추지 않고 <.*>
해당 줄에서 일치합니다 . 그리고 말이 안 됩니다( 이미 일치하는 항목이 없으므로 선택 사항으로 만들 필요가 없습니다).<h> PIDAT <h>
>
.*?
.*
?
이것은 효과가 있을 수 있습니다:
sed -i -Ee 's/^(<[^>]*>).*/\1/' *.conll
[^>]
을 제외한 모든 항목과 일치하므로 >
일치 <[^>]*>
하지만 <h>
일치하지 않습니다 <h> PIDAT <h>
.