나는 최근 직장에서 누군가에게 ipcs -qa의 출력을 가져와서 공백으로 구분하여 구문 분석하고 모니터링을 위해 데이터베이스에 저장하는 방법을 물었습니다. 그는 나에게 이것을 주었다:
ipcs -qa | sed 's/ [ ]* / /g'
작동하지만 왜 그럴까요? 그는 어떻게 그 패턴 문자열을 만들었나요? 빌드 방법에 대한 문서는 어디서 찾을 수 있나요? 매뉴얼 페이지를 확인했지만 매우 불투명합니다.
답변1
sed 's/ [ ]* / /g'
\_/ | \____/ | |
| | | | \- g=globally (not just one occurrence)
| | | |
| | | \- to
| | |
| | \- from
| |
| \- s=substitute
|
\- program sed
섹션에서:
/ [ ]* /
| \_/|
| | \- repeated 0-infinite times
| |
| \- group of characters
|
\- boundary
*를 포함하여 3개의 수량자가 있습니다:
- 0에서 무한대? 0회 또는 1회
- 1~무한대
일반적으로 마지막 문자만 참조하므로 x*는 x, xxxx 및 아무것도 일치하지 않습니다. 엑스? 0 또는 1과 일치 x, x+는 x, xx, xxx 등과 일치 그러나 [aeiou]+ 또는 대괄호(foo)*로 묶인 조합과 같은 문자 집합과 일치할 수 있습니다. 첫 번째는 iiaiaei와 일치하고 두 번째는 foo 및 foofoo와 일치합니다.
그룹은 열거형 [aeiou] 또는 from-to 그룹: [az] 또는 조합: [0-9a-fA-F:]일 수 있습니다. 그룹에 빼기 기호를 포함하려면 끝이나 시작 부분에 넣어야 합니다([-,:]).
가장 일반적으로 사용되는 명령은 아마도 "s"일 것입니다. 다른 "d"는 삭제를 의미하고 "p"는 인쇄를 의미합니다.
패턴은 구분 기호(보통 슬래시)로 묶입니다.
sed 's/foo/bar/'
sed는 라인 지향적입니다. (첫 번째) foo를 bar로 바꾸려면 위 명령을 사용하면 됩니다. 모두 바꾸려면 전역에 "g"가 필요합니다.
sed 's/foo/bar/g'
sed를 사용하여 줄 번호를 호출하는 다른 방법:
sed -n '1,5p' file
-n은 기본적으로 인쇄하지 않습니다. 1,5p는 라인 1부터 라인 5까지 인쇄한다는 의미입니다.
sed '6,$d' file
이는 동일합니다. 6행부터 끝까지 모두 삭제됩니다.
sed '5q' file
다시 마찬가지입니다. 5행 이후 종료합니다.
일반적으로 sed를 사용하면 명령을 읽는 것보다 쓰는 것이 더 쉽습니다.
답변2
처음에는 모두 잘 작동하는 것 같습니다.
sed 's/[ ]* / /g'
sed 's/ [ ]*/ /g'
sed 's/ * / /g'
sed 's/ * / /g'
sed 's/ */ /g'
sed 's/ \+/ /g'
sed 's/ \+ / /g'
기본적으로 이 함수는 2개의 공백과 임의 개수의 연속 공백을 일치시키는 것뿐입니다. 정규식은 기본적으로 탐욕적이므로 "모든 숫자"는 찾을 수 있는 최대 숫자이기 때문에 작동합니다. (그리고 [ ]
"다음 중 하나와 일치"이면 공백 문자만 나열하면 됩니다)
공백을 다루기 때문에 질문에 사용된 특정 구문이 이상적입니다.
sed 's/ [ ]* / /g'
두 개의 공백 문자가 인접해 있지 않으므로 한눈에 세 개의 공백이 있음을 알 수 있으며, 그보다 작은 것은 철자가 틀린 것으로 해석될 가능성이 높습니다.