숫자 뒤에 "a"와 "aa"를 grep하는 방법은 무엇입니까?

숫자 뒤에 "a"와 "aa"를 grep하는 방법은 무엇입니까?

내 .txt 파일에는 다음과 같은 줄이 포함되어 있습니다.

1a
1aa
2a
2aa

"a" 쪽에 대해 하나의 특정 작업을 수행하고 "aa" 쪽에 대해 또 다른 특정 작업을 수행하고 싶습니다. 더 정확하고 명확하게 말하자면, 당사자 "a"에 대해 내가 수행하는 작업은 당사자 "aa"에 적용되어서는 안 되며, 마찬가지로 당사자 "aa"에 대해 내가 수행하는 작업은 당사자 "a"에 적용되어서는 안 됩니다.

예를 들어:

  • "aa"측에서는 디렉토리로 이동하고 싶습니다
  • "a" 쪽의 경우 여러 디렉터리로 이동하고 싶습니다.

내 스크립트에서 이 작업을 어떻게 수행할 수 있나요?

답변1

grep -xE '[0-9]+a'

xGreps는 하나 이상의 10진수 뒤에 10진수가 포함된 행만 찾습니다 a.

grep -xE '[0-9]+aa'

.aa

-E이다확장 정규식필수 +. 기본 정규식을 사용하거나 사용하지 않고 -x다음을 수행할 수 있습니다.

grep '^[0-9]\{1,\}a$'

^$줄의 시작과 끝에서 각각 일치하며 \{1,\}BRE는 ERE와 동일합니다 +(일부 grep구현에서는 \+이를 지원하며 언제든지 사용할 수 있습니다 [0-9][0-9]*).

답변2

정규식 a도 "aa"와 일치하므로 스크립트에서 "aa"를 먼저 처리해야 합니다.

또 다른 옵션은 Perl 호환 정규식(PCRE)을 사용하는 것입니다. grep에는 -P경고와 함께 이를 활성화하는 옵션이 있습니다.

이는 매우 실험적이며 grep -P구현되지 않은 기능에 대해 경고할 수 있습니다.

(적어도 내가 가지고 있는 버전에서는 옵션을 제거했는지 또는 새 버전에서 경고를 변경/제거했는지 모르겠습니다) 또는 를 사용할 수 있습니다 . 그러면 "a"의 경우 perl유사한 정규식이 작동합니다./a(?!a)/

답변3

#!/bin/sh

while read word; do
    case "$word" in
        *aa)    printf 'Got double "a": %s\n' "$word"   ;;
        *a)     printf 'Got single "a": %s\n' "$word"   ;;
        *)      printf 'Got weirdness:  %s\n' "$word"   ;;
    esac
done <file.in

다음 샘플 데이터를 사용하여 이 명령을 실행합니다 file.in.

Got single "a": 1a
Got double "a": 1aa
Got single "a": 2a
Got double "a": 2aa

기존 루프 주위에 파일을 반복하여 확장할 수 있습니다 while.

#!/bin/sh

for name in ./*.in; do
    while read word; do
        case "$word" in
            *aa)    printf 'Got double "a": %s\n' "$word"   ;;
            *a)     printf 'Got single "a": %s\n' "$word"   ;;
            *)      printf 'Got weirdness:  %s\n' "$word"   ;;
        esac
    done <"$name"
done

이는 입력한 파일이 패턴과 일치 *.in하고 현재 디렉터리에 있다고 가정합니다.

답변4

aa와 접미사를 일치시킬 수 있습니다 aa$. 접미사를 일치시키는 것은 논리적 으로도 끝나기 a때문에 조금 어렵습니다 . 그렇기 때문에 단일 a와 일치해야 합니다. 이는 a를 제외한 모든 문자를 포함하는 반전 문자 클래스입니다.aaa[^a]a$[^a]

관련 정보