sed에서 문자열을 정규식으로 바꾸기

sed에서 문자열을 정규식으로 바꾸기

sed를 사용하여 명령 출력을 정규 표현식으로 바꾸려고 하는데 알 수 없습니다.

regex101.com에서 정규식을 테스트했는데 내가 원하는 것이 꽤 잘 그룹화되어 있는 것 같았습니다. 하지만 sed가 정규식 그룹 패턴과 어떻게 작동하는지 이해할 수 없습니다.

명령 출력은 다음과 같습니다.

appstream              CentOS Linux 8 - AppStream
baseos                 CentOS Linux 8 - BaseOS
epel                   Extra Packages for Enterprise Linux 8 - x86_64
epel-modular           Extra Packages for Enterprise Linux Modular 8 - x86_64
extras                 CentOS Linux 8 - Extras

이것이 내가 분석하고 싶은 것입니다:

CentOS Linux 8 - AppStream
CentOS Linux 8 - BaseOS
Extra Packages for Enterprise Linux 8 - x86_64
Extra Packages for Enterprise Linux Modular 8 - x86_64
CentOS Linux 8 - Extras

마음속에 떠오르는 sed 정규식은 다음과 같습니다.

sed -E 's/"(^.*?\s)([A-Z|a-x].*)"/\2/g'

문제를 찾는 데 도움을 줄 수 있는 사람이 있나요?

감사해요!

답변1

많은 질문이 있습니다:

  1. 작은따옴표 안의 큰따옴표는 리터럴입니다. 명령 출력에 포함되지 않으므로 "절대 일치하지 않습니다.

  2. 명령이 출력되는 경우했다선행 따옴표가 있으면 행 앵커가 ^일치할 수 없습니다.뒤쪽에그런 사람

  3. ?아마도 Perl의 non-greedy 수정자를 지원하는 엔진에서 정규식을 테스트했을 것입니다. sed에서는 ?리터럴(BRE) 또는 간단한 수량자(ERE, 여기 플래그와 같은 )이므로 0 또는 1번의greedy Match가 -E발생합니다..*

  4. \s하나만 일치함하나의공백 문자도 .*?엄격히 Perl 확장과 유사합니다(최신 버전의 GNU sed는 이를 지원하지만). 이식성을 위해 다음으로 변경할 수 있습니다.[[:blank:]]

  5. |inside는 [...]대체를 의미하지 않습니다(단, 표현식이 일치하는 것을 막지는 않지만 문자도 일치합니다 |).

sed 구현을 가정하십시오.하다지원 \s및 그 보충제는 \S귀하가 원하는 것일 수 있습니다.

sed -E 's/^(\S+\s+)([A-Za-z].*)/\2/'

더 간단하게 할 수는 있지만

sed -E 's/\S+\s+(.*)/\1/'

아니면 그냥

sed -E 's/\S+\s+//'

공백이 아닌 일련의 공백 뒤에 오는 일련의 공백을 일치시켜 제거합니다. 당신의 sed가 이것을한다면아니요\S`를 제공 \s하면 POSIX 문자 클래스로 동일한 작업을 수행할 수 있습니다.

sed -E 's/[^[:blank:]]+[[:blank:]]+//'

또는 전체 POSIX sed로 제한되는 경우( +모드에 관계없이 어느 것도 수량자가 아닙니다)

sed 's/[^[:blank:]]\{1,\}[[:blank:]]\{1,\}//'

당신은 또한 볼 수 있습니다내 정규 표현식이 X에서는 작동하지만 Y에서는 작동하지 않는 이유는 무엇입니까?

답변2

공백이 아닌 문자 뒤에 있는 일련의 공백을 찾아 이를 개행 문자로 변경합니다(개행 문자는 확실히 나타나지 않으므로). 그런 다음 개행 문자 앞에 있는 모든 것을 가져옵니다. 방금 첫 번째 필드를 삭제했습니다.

sed -e 's/\S\s+/\n/;s/.*\n//' file

관련 정보