![숫자 뒤에 "a"와 "aa"를 grep하는 방법은 무엇입니까?](https://linux55.com/image/114703/%EC%88%AB%EC%9E%90%20%EB%92%A4%EC%97%90%20%22a%22%EC%99%80%20%22aa%22%EB%A5%BC%20grep%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
내 .txt 파일에는 다음과 같은 줄이 포함되어 있습니다.
1a
1aa
2a
2aa
"a" 쪽에 대해 하나의 특정 작업을 수행하고 "aa" 쪽에 대해 또 다른 특정 작업을 수행하고 싶습니다. 더 정확하고 명확하게 말하자면, 당사자 "a"에 대해 내가 수행하는 작업은 당사자 "aa"에 적용되어서는 안 되며, 마찬가지로 당사자 "aa"에 대해 내가 수행하는 작업은 당사자 "a"에 적용되어서는 안 됩니다.
예를 들어:
- "aa"측에서는 디렉토리로 이동하고 싶습니다
- "a" 쪽의 경우 여러 디렉터리로 이동하고 싶습니다.
내 스크립트에서 이 작업을 어떻게 수행할 수 있나요?
답변1
grep -xE '[0-9]+a'
x
Greps는 하나 이상의 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를 제외한 모든 문자를 포함하는 반전 문자 클래스입니다.aa
a
[^a]a$
[^a]