$1은 sed와 함께 사용할 수 없습니다.

$1은 sed와 함께 사용할 수 없습니다.

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>.

관련 정보