
다음을 포함하는 "test"라는 파일이 있습니다.
linux
Unixlinux
Linuxunix
it's linux
l...x
이제 를 사용하면 grep '\<l.*x\>'
다음과 일치합니다.
linux
it's linux
l...x
하지만 을 사용하면 grep '\<l*x\>'
다음과만 일치합니다.
l...x
, 그러나 참조 가이드에 따르면 * 를 사용하면 앞의 항목은 0번 이상 일치합니다. 즉, 'l'로 시작하고 'x'로 끝나는 항목과 일치해야 합니다.
원하는 결과가 표시되지 않거나 내가 잘못 이해한 이유를 설명할 수 있는 사람이 있나요?
답변1
표기법(.*)
정규식 .* 및 *의 *는 말당 문자가 아닌 개수를 의미하며 더 정확하게는 의미합니다.'0개 이상'. 더욱이,.수단'모든 단일 문자'.
그래서 그것들을 합치면'0개 이상의 문자'. 예를 들어 다음과 같은 문자열은 다음과 같습니다.
- 리눅스
- linnnnnx
- lnx
- 안녕 리눅스
- 1x
와 일치할 것<l.*x>
. 마지막은 중요합니다..*아무것도 일치할 수 없습니다.
표기법(*)
내가 말했듯이 *만을 사용하는 것은 카운터입니다. 따라서 다음과 같은 문자 뒤에 넣으면'엘'*가 말하고 있는 것'0개 이상의 l'.
에 대해 grep하면 l*x
와 일치 l...x
하지만 아마도 여러분이 생각하는 이유 때문에 그렇지 않을 것입니다.
% echo "l...x" | grep "l*x"
l...x
후행 'x'와 일치합니다. 'l'은 'x' 앞에 다음이 있다는 사실을 제외하면 이것이 일치하는 이유와 아무 관련이 없습니다.'0개 이상의 l'.
답변2
"l"로 시작하고 "x"로 끝나는 항목과 일치시키려면 정규식 "l.*x"를 사용해 보세요. 여기 "." 및 "*"는 각각 유효한 단일 문자와 길이가 0 이상인 문자를 나타내는 특수 문자입니다. 여기서 "*" 앞에 오는 것은 "."이므로 "." 대신에 오는 것은 무엇이든 됩니다. 위와 같이 "*"의 정의에 따라 반복됩니다.
답변3
셸(예: bash)의 경우 조커가 파일 이름을 일치시키는 데 사용되고 문자 자체인 *
경우 ?
문자를 나타냅니다.
반면에 정규 표현식의 경우 , *
, ?
( {n,m}
발생 범위) 및 +
( egrep
만)은 그 자체로는 아무것도 아닙니다. 그들은 항상 이전 문자/원자를 참조합니다. 날씨는 실제 문자(예: L
또는 5
)이고, .
모든 문자, 문자 범위(예: [a-f]
) 또는 여러 문자의 패턴(egrep만)을 나타낼 수 있는 (조커)입니다. (abba)
- 여기서 "아바"는 단위로 간주됩니다. 따라서 *
and 는 ?
그 자체로는 아무 것도 나타내지 않지만 이전 문자(특정 문자 또는 하나의 단위로 취급되는 그룹에 대한 조커일 수 있음)가 몇 번이나 반복되어야 하는지에 대해 알려줍니다.
쉘과 정규 표현식이 *
and 를 사용하는 방식 사이의 이러한 차이점을 기억하고 나면 ?
올바른 위치에 있어야 합니다.
따라서 정규식의 경우:
.
- 어떤 문자든 정확히 한 번 나타나는 것을 나타냅니다.a..a
- 두 개의 a와 사이에 있는 모든 종류의 두 문자와 일치합니다..*
- 임의의 문자가 0, 1개 이상 일치합니다.B*
- "B"가 0, 1개 이상 일치합니다.