Sed 명령 내 정규식 문제 직면

Sed 명령 내 정규식 문제 직면

다음 명령을 실행한다고 가정해 보겠습니다.

export STR="abcdef.ghijkl.mnopqr.stuvwy.log"
echo $STR | sed 's/\.[^.]*$//'

나는 다음과 같은 결과를 얻습니다.

abcdef.ghijkl.mnopqr.stuvwy

위 결과가 이해가 안되네요.

답변1

sed 패턴에는 \.[^.]*$원래 문자열과 일치하는 항목이 하나만 있습니다: .log.

세부 사항:

  • \.점 문자만 일치합니다.
  • [^.]무엇이든 다른 것과 일치.
  • [^.]*다음과 다른 문자 시퀀스와 일치합니다..
  • $줄의 끝과 일치합니다.

따라서 여기서 마지막 항목 .log은 유일한 일치 항목입니다( .stuvwy.log내부 점이 포함되어 있으므로 일치 항목이 아님). sed명령에서 요구하는 대로 빈 문자열로 대체됩니다 s/\.[^.]*$//. 그래서 당신은 끝납니다 :

abcdef.ghijkl.mnopqr.stuvwy

답변2

원하지 않으면 sed쉘의 내장 패턴 대체를 사용할 수 있습니다. 이는 실제로 더 빠르며 외부 프로그램을 호출할 필요가 없습니다.

${VAR%.*}.*glob 패턴과 일치하는 항목이 다음에서 제거됩니다.. $VAR​정규 표현식이 아닌 glob이므로 .문자 그대로 "."을 의미합니다.

$ foo=aaa.bbbb.2011.log
$ echo ${foo%.*}
aaa.bbbb.2011

바라보다쉘 매개변수 확장BASH 매뉴얼 페이지에서 자세히 알아보세요.

답변3

s/\.[^.]*$//g==는 점( )으로 시작하는 문자열의 첫 번째 부분을 대체합니다(모든 항목과 일치하는 옵션이 끝에 없기 때문에). 그 \.뒤에 점( )이 아닌 0개 이상의 *( ) 문자가 [^.]위치합니다. 문자열( $), 빈 문자열( //).

관련 정보