ls | xargs -n 1 basename | grep -E '[0-9]{1}'
왜 0-9 사이의 단일 숫자만 표시되지 않는지 아는 사람이 있습니까 ?
예를 들어 다음과 같은 경우가 있습니다.
touch 1
touch 22
touch 333
touch test_file
내가 실행하면 ls | xargs -n 1 basename | grep -P '[0-9]{1}'
:
1, 22, 333개의 파일이 나열되어 있습니다.
내가 실행하면 ls | xargs -n 1 basename | grep -P '[0-9]{2}'
:
22개와 333개의 파일이 나열되어 있습니다.
저는 {2}이 22개의 파일만 표시하길 원합니다.
답변1
내 생각에 당신이 현재 일어나고 있는 것과 다른 것을 기대하는 이유는 당신이 받아들이고 있기 때문이라고 생각합니다.
[0-9]{n}
이는 [0-9]에 있는 n개의 문자만 일치시키고 나머지는 버리는 것을 의미하는 반면, 수행하는 작업은 [0-9]에 있는 n개의 문자를 찾아서 일치라고 부르는 것입니다. 그래서
[0-9]{1}
언제든지 [0-9]와 일치하는 항목을 정확히 찾을 것이므로 1개는 일치하고, 22개를 확인하면 처음 2개에서 멈추고 나머지는 보지 않고 일치한다고 생각합니다. 333도 마찬가지다. 당신이 지정하는 경우
[0-9]{2}
1개와 일치하지 않고 22개 게임과 일치한 다음 333개 게임 중 33개 게임과 일치하므로 가져옵니다.
slm이 말했듯이 여기서는 단어 경계가 핵심입니다. 귀하의 질문에 일치하는 grep 정규 표현식에는 -P 및 -E 스타일이 모두 있습니다. 다음과 같이 -E와 함께 GNU \< 및 \>를 사용할 수 있습니다.
ls | xargs -n 1 basename | grep -E '\<[0-9]{1}\>'
또는 \b는 다음과 같이 -E 또는 pcre -P와 일치합니다.
ls | xargs -n 1 basename | grep -P '\b[0-9]{1}\b'
답변2
grep -x
행 내에서 일치하는 항목이 아닌 정확한 일치 항목을 찾는 데 사용됩니다 .
grep foo
을 포함하는 행 찾기 foo
, 또한 grep -x foo
다음을 포함하는 행 찾기예 foo
.
마찬가지로 grep -E '[0-9]{1}'
( 와 동일 grep '[0-9]'
)은 한 자리 숫자가 포함된 행을 찾습니다. grep -xE '[0-9]{1}'
한 자리 숫자로 구성된 행을 찾습니다.
GNU를 사용하면 또는 옵션을 사용하여 일치하는 항목을 확인할 grep
수 있습니다 . 물론 모든 일치 항목이 표시됩니다.--color
-o
답변3
이는 처음 두 문자가 333
정규식과 일치하므로 전체 줄이 일치하기 때문입니다.
이를 피하려면 다음을 사용할 수 있습니다.
(^|[^0-9])[0-9]{2}([^0-9]|$)
답변4
예제의 내용을 텍스트 파일에 넣으면 grep
일치하는 이유를 확인할 수 있습니다.
$ grep -E '[0-9]{1}' file.txt
touch 1
touch 22
touch 333
단어 경계( )를 사용하면 일치하는 문자열이 아닌 정규식( )의 단일 단어만 일치시키려는 -w
것을 나타낼 수 있습니다.grep
\<REGEX\>
$ grep -Ew '\<[0-9]{1}\>' file.txt
touch 1
$ grep -Ew '\<[0-9]{2}\>' file.txt
touch 22
$ grep -Ew '\<[0-9]{3}\>' file.txt
touch 333
\<
경계가 어디에 있는지 알려 주세요 \>
. grep
이렇게 하면 grep
명시적인 단어(예: 1)는 일치하지만 문자열(예: 11, 111 또는 aa11aa)은 일치하지 않습니다. 왜냐하면 이러한 문자열의 정규 표현식이 단어 경계 내에 포함되어 있지 않기 때문입니다.