GREP + REGEX가 예상대로 작동하지 않습니다.

GREP + REGEX가 예상대로 작동하지 않습니다.

ls /dev의 출력을 1-4 사이의 숫자로 끝나는 "tty"와 일치시키려고 합니다.

그래서:

tty5
tty4
tty2
tty6
tty1

일치해야 함:

tty4
tty2
tty1

정규식

"\s([tty]+[0-4])\s"

그 일을 수행하다정규식.

나는 이것을 grep과 함께 사용해 보았습니다.

ls /dev | grep -E \s([tty]+[0-4])\s

ls /dev | grep -E \s([tty]\+\[0-4])\s

ls /dev | grep -Ex \s([tty]+[0-4])\s

ls /dev | grep -P \s([tty]+[0-4])\s

다른 게시물에서 읽은 것처럼 여전히 작동하지 않습니다.

답변1

\s일치하지 않는 이유는 문자열( ) 앞 tty과 끝에서 공백을 찾고 있기 때문입니다 . ls한 줄에 하나의 항목이 인쇄되므로 여기서는 이런 일이 발생하지 않습니다 . ls와 같지 않으니 주의하시기 바랍니다 ls | command. 이 옵션은 의 출력이 ls파이프로 연결될 때 활성화되어 한 줄에 하나의 항목만 인쇄됩니다. 이를 제거하면 예상대로 작동합니다 .-1ls\s

ls /dev | grep -E '([tty]+[0-4])'

그러나 이는 원하지 않는 모든 종류의 항목과도 ​​일치합니다. 이 정규식은 전혀 필요한 것이 아닙니다. [ ]~을 만들다캐릭터 클래스. 이 표현식은 하나 이상의 또는 와 동일 [tty]+하며 일치합니다 . 즉 , , 또는 , 또는 이러한 문자 중 하나 또는 두 개의 다른 조합과 일치한다는 의미입니다 . 또한 여기서는 괄호가 의미가 없습니다.[ty]+tyttttttttttttttttttytytytytytytytytyt캡처 그룹하지만 당신은 그것을 사용하지 않았습니다. 당신이 원하는 것은 다음과 같습니다.

$ ls /dev | grep '^tty[0-4]$'
tty0
tty1
tty2
tty3
tty4

내가 어떻게 추가했는지 주목하세요 $. 따라서 표현식은 tty그때 에만 일치합니다.하나줄 끝까지( $)까지의 숫자(1, 2, 3, 4 중 하나)입니다.

물론 안전한 방법으로 모든 문제를 피할 수 있습니다파싱의 위험성ls대신 glob을 사용하세요.

$ ls /dev/tty[0-4]
/dev/tty0  /dev/tty1  /dev/tty2  /dev/tty3  /dev/tty4

그렇지 않으면

$ echo /dev/tty[0-4]
/dev/tty0 /dev/tty1 /dev/tty2 /dev/tty3 /dev/tty4

답변2

이 정규식은 약간 너무 복잡해 보입니다. 또한 따옴표를 사용해야 합니다!

$ ls /dev | grep -E "tty[1-4]$"
tty1
tty2
tty3
tty4

그러나 다음 내용을 반드시 읽어야 합니다.왜 `ls`를 구문 분석하지 *않나요*(그리고 어떻게 수행합니까)?

답변3

bash-4.2$ ls -l /dev | grep -o "tty[1-4]$"
tty1
tty2
tty3
tty4


bash-4.2$ ls -l /dev | awk '/tty[1-4]$/{print $NF}'
tty1
tty2
tty3
tty4

bash-4.2$ output=$(ls /dev); echo "${output}" | grep "tty[1-4]$"
tty1
tty2
tty3
tty4

관련 정보