정규 표현식은 단지 표현일 뿐입니다. 도구가 이 표현을 지원하는 한 도구는 정규 표현식 문자열을 처리할 수 있습니다. vim, grep, awk, sed는 모두 정규식을 지원하는데, 제가 예전에 일했던 회사는 정규식을 지원하는 웹 기반 서비스 웹사이트(nginx)였기 때문에 강력했습니다. 수요가 상대적으로 많아서 정규식 공부도 좀 했고, 공유하고 싶습니다.
1 기본 정규식
grep 도구는 이전에 소개한 적이 있습니다.
grep -[acinv] '콘텐츠 문자열 검색' 파일 이름
-a 텍스트 파일에서 검색
-c 발견된 일치하는 줄 수 계산
-i 대소문자 무시
-n 그런데 행 번호 출력
-v 역방향 선택, 즉 검색 문자열이 없는 행을 찾습니다.
여기서 검색 문자열은 정규식일 수 있습니다.
1
및 출력 Line이 있는 행을 검색합니다. number
$grep -n 'the' Regular_express.txt
the가 없는 행을 검색하여 행 번호를 출력합니다.
$grep -nv 'the' Regular_express.txt
2 [ ] 사용 검색 집합 문자
[]는 문자 중 하나를 나타냅니다. 예를 들어 [ade]는 a, d 또는 e를 나타냅니다.
woody@xiaoc:~/tmp$ grep -n 't[ae]st' Regular_express.txt
8:테스트를 못 마치겠어요.
9:오! 국물 맛있네요!
[] 외부에 있는 문자를 나타내려면 ^ 기호를 사용하면 됩니다. 문자.
예를 들어 oo 앞에 g 없이 문자열이 포함된 행을 검색합니다. 검색 문자열로 '[^g]oo'를 사용합니다.
woody@xiaoc:~/tmp$ grep -n '[^g]oo ' Regular_express .txt
2:사과는 제가 가장 좋아하는 음식입니다.
3:축구 게임은 발만 사용하는 것이 아닙니다.
18:google은 검색 키워드에 가장 적합한 도구입니다.
19:goooooogle 네!
[]는 범위로 나타낼 수 있습니다. 예를 들어 [a-z]는 소문자를 나타내고, [0-9]는 0부터 9까지의 숫자를 나타내고, [A-Z]는 대문자를 나타냅니다. [a-zA-Z0-9]는 모든 숫자와 영문자를 나타냅니다. 물론 ^를 사용하여 문자를 제외할 수도 있습니다.
숫자가 포함된 줄 검색
woody@xiaoc:~/tmp$ grep -n '[0-9]' Regular_express.txt
5: 그런데 이 드레스는 약 3183달러입니다
. 15:You are the best is menu you are no.1
줄의 첫 번째와 마지막 문자 ^ $. ^는 줄의 시작을 나타내고 $는 줄의 끝을 나타냅니다. 문자이지만 위치) '^$'는 줄의 시작과 끝에
만 있기 때문에 빈 줄을 의미합니다.
여기서 ^의 의미는 []에 사용된 의미와 다릅니다. 이는 ^ 뒤의 문자열이 줄의 시작 부분에 있음을 의미합니다.
예를 들어
woody@xiaoc:~/tmp$ grep -n '^the' Regular_express.txt
12: '*' 기호는 별표로 표시됩니다. 🎜>
소문자로 시작하는 줄 검색
woody@xiaoc:~/tmp$ grep -n '^[a-z]' Regular_express.txt
2:apple은 제가 가장 좋아하는 음식입니다
4. :이 드레스는 나에게 맞지 않습니다.
10:오토바이는 자동차보다 저렴합니다.
12:'*' 기호는 별표로 표시됩니다.
18:google은 검색어에 가장 적합한 도구입니다. 🎜>19 :gooooooogle!
20:가자!
woody@xiaoc:~/tmp$
영어로 시작하지 않는 줄 검색
@xiaoc:~/tmp $ grep -n '^[^a-zA-Z]' Regular_express.txt
1:"오픈 소스"는 프로그램을 개발하는 데 좋은 메커니즘입니다.
21:#나는 VBird입니다.
woody@xiaoc :~/tmp$
$는 문자열이 줄 끝에 있음을 의미합니다. 예를 들어 '.'은 줄 끝을 의미합니다.
검색 끝에 .가 있는 줄
woody@xiaoc:~ /tmp$ grep -n '.$' Regular_express.txt //.는 정규 표현식의 특수 기호이므로 이스케이프 처리하세요.
1: "오픈 소스"
2 : 사과는 제가 제일 좋아하는 음식이에요
3: 축구 경기는 발만 사용하는 게 아니에요
4: 이 옷은 나한테 안 맞아요. 그런데 이 드레스는 약 $3183입니다.
6:GNU는 공짜 맥주가 아닙니다.
.....
MS 시스템에서 생성된 텍스트 파일에는 ^M이 있습니다. 개행 문자에 문자가 추가됩니다. 따라서 마지막 문자는 숨겨집니다. ^M Windows
에서 텍스트를 처리할 때 특히 주의하세요!
cat dos_file | tr -d 'r' >을 사용하여 ^M 기호를 삭제할 수 있습니다. ^M==r
그럼 '^$'는 줄의 시작과 끝 부분에 있는 빈 줄만 뽑아낸다는 뜻이에요!
빈 줄 검색
woody@xiaoc:~/tmp$ grep -n '^$' Regular_express.txt
22:
23:
woody@xiaoc:~/tmp$
비어 있지 않은 줄 검색
woody@xiaoc:~/tmp$ grep -vn '^$' Regular_express.txt
1:"오픈 소스"는 프로그램을 개발하는 데 좋은 메커니즘입니다. 🎜>2 :사과는 제가 가장 좋아하는 음식입니다.
3:축구 경기는 발만 사용하는 것이 아닙니다.
4:이 드레스는 나에게 맞지 않습니다.
..........
반복되는 문자가 포함된 모든 문자*
Bash에서 *는 임의 개수의 문자를 나타내는 데 사용되는 와일드카드 문자를 나타내지만 정규 표현식에서는 *가 특정 문자를 0개 이상 나타내는 의미가 다릅니다.
예를 들어 oo*는 첫 번째 o가 반드시 존재해야 하고, 두 번째 o는 하나 이상 또는 없음을 의미하므로 최소한 하나의 o를 나타냅니다.
임의의 문자를 나타냅니다. , 반드시 존재해야 합니다. g??d는 'g..d'로 표현될 수 있다. good,gxxd,gabd....모두 일관성이 있습니다.
woody@xiaoc:~/tmp$ grep -n 'g..d' Regular_express.txt
1:"오픈 소스"는 프로그램을 개발하는 데 좋은 메커니즘입니다.
9:오! 수프 맛 좋아요!
16:'glad'로 세상은 똑같습니다.
woody@xiaoc:~/tmp$
오가 2개 이상인 문자열을 검색하세요
woody@ xiaoc:~/tmp$ grep -n 'ooo*' Regular_express.txt //처음 두 개의 o는 반드시 존재해야 하며, 세 번째 o는 존재하지 않거나 여러 개 있을 수 있습니다.
1:"오픈 소스"는 프로그램을 개발하는 데 좋은 메커니즘입니다.
2:사과는 제가 가장 좋아하는 음식입니다.
3:축구 게임은 발만 사용하는 것이 아닙니다.
9:오! 맛있어요!
18:google은 검색 키워드에 가장 적합한 도구입니다.
g로 시작하고 중간에 o가 하나 이상 있는 문자열을 검색하세요. , 즉, gog, goog ....gooog...etc.
woody@xiaoc:~/tmp$ grep -n 'goo*g' Regular_express.txt
18:google은 다음을 위한 최고의 도구입니다. 검색 키워드
19: gooooooogle 예!
g로 시작하고 끝나는 줄을 검색하세요
woody@xiaoc:~/tmp$ grep -n 'g.*g' Regular_express.txt / / .*는 0 또는 임의 개수의 문자를 의미합니다.
1:"오픈 소스"는 프로그램을 개발하는 데 좋은 메커니즘입니다.
14:gd 소프트웨어는 프로그램 초안 작성을 위한 라이브러리입니다.
18:google은 검색 키워드에 대한 최고의 도구입니다.
20:가자!
연속되는 문자의 범위를 제한하세요. onlylimit 0 or more 반복되는 문자의 수를 구체적으로 제한하려면 {range}를 사용하세요. 범위는 2~5를 나타내는 2,5로 구분된 숫자입니다.
2는 2, 2, 2 이상을 나타냅니다.
SHELL에서는 { }가 특별한 의미를 갖기 때문에 다음과 같이 사용됩니다. 정규 표현식을 사용할 때는 이스케이프 처리해야 합니다.
두 개의 o가 포함된 문자열이 포함된 줄을 검색합니다.
woody@xiaoc:~/tmp$ grep -n 'o{2}' Regular_express.txt
1:"오픈 소스"는 프로그램을 개발하는 데 좋은 메커니즘입니다.
2:apple은 제가 가장 좋아하는 음식입니다. .
3:축구 게임은 발만 사용하는 것이 아닙니다.
9:오! 국물이 맛있네요.
18:google은 검색어에 가장 적합한 도구입니다.
g 다음에 2~5o가 나오고 그 뒤에 g 문자열이 오는 줄을 검색하세요.
woody@xiaoc:~/tmp$ grep -n 'go{2,5}g' Regular_express.txt
18:google은 검색 키워드를 위한 최고의 도구입니다.
g 다음에 두 개 이상의 o가 오고 그 뒤에 g가 오는 줄입니다. .
woody@xiaoc:~/tmp$ grep -n 'go{2,}g' Regular_express.txt
18:google은 검색 키워드를 위한 최고의 도구입니다.
19:goooooogle
[] 안의 ^는 특별한 의미를 표현하지 않으며, [] 안의 내용 뒤에 올 수 있다는 점에 유의하세요.
'[^a-z.!^ -]'는 소문자, no!, 공백 없음, - 문자열 없음을 의미합니다. []에는 작은 공백이 있습니다.
또한 쉘의 역선택은 [!range]이고 정규식의 경우 [^range]입니다.
2 확장 정규식
확장 정규식 표현식 기본 정규식에 몇 가지 특수 구성요소를 추가합니다.
특정 작업을 더욱 편리하게 해줍니다.
예를 들어 빈 줄과 #으로 시작하는 줄을 제거하려면 다음을 사용합니다.
woody@xiaoc:~/tmp$ grep -v '^$' Regular_express.txt | ^#'
"오픈 소스"는 프로그램을 개발하는 데 좋은 메커니즘입니다.
사과는 제가 가장 좋아하는 음식입니다.
축구 게임은 발만 사용하는 것이 아닙니다.
이 드레스는 저에게 맞지 않습니다. 🎜>...........
하지만 확장 정규식과 확장 특수 기호 |를 지원하는 egrep을 사용하는 것이 훨씬 더 편리합니다.
grep은 기본 표현식만 지원하는 반면 egrep은 확장 표현식을 지원합니다. 실제로 egrep은 grep -E의 별칭입니다. 따라서 grep -E는 확장 정규식을 지원합니다.
그런 다음:
woody@xiaoc:~/tmp$ egrep -v '^$|^#' Regular_express.txt
"오픈 소스"는 프로그램을 개발하는 데 좋은 메커니즘입니다.
apple은 나의 것입니다. 좋아하는 음식.
축구 경기는 발로만 하는 게 아니다.
이 옷은 나한테 안 맞는다. .......
여기|는 OR 관계를 나타냅니다. 즉, ^$ 또는 ^#을 만족하는 문자열입니다.
다음은 몇 가지 확장 특수 기호입니다.
+는 .*와 유사한 기능을 갖고 하나 이상의 반복 문자를 나타냅니다.
?는 .*와 비슷한 효과를 가지며 0개 또는 1개의 문자를 나타냅니다.
|는 관계 또는 관계를 나타냅니다. 예를 들어 'gd|good|dog'은 콘텐츠의 일부를 단위 그룹으로 결합하는 gd, good 또는 dog
()을 포함하는 문자열을 나타냅니다. 예를 들어, 기쁜 또는 좋은 것을 검색하려면 'g(la|oo)d'
()를 사용하면 됩니다. 그룹에 대해서는 + ? * 등을 사용할 수 있다는 장점이 있습니다.
예를 들어 A와 C로 시작하고 끝나며 중간에 하나 이상의 (xyz)가 있는 문자열을 검색하려면 'A(xyz)+C'와 같이 하면 됩니다.