예를 들어 다음과 같은 문자열이 있습니다 1341 5415 fdad
.
명령은 grep -E "(^|\s)[1-9]{1,5}($|\s)" -o
제공 하지만 합계를 1341
얻고 싶습니다 .1341
5415
어떻게 해야 하나요?
답변1
echo '1341 5415 fdad' | grep -E -o '\b[1-9]{1,5}\b'
산출:
1341 화 5415
-E
: PATTERNS를 확장 정규식으로 해석합니다.
-o
:일치하는 줄의 일치하는(비어 있지 않은) 부분만 인쇄하고, 각 부분은 별도의 출력 줄에 표시합니다.
\b
:너비가 0인 단어 경계
답변2
당신이 얻는 실제 일치는 1341␣
후행 공백이 있는 입니다. grep은 겹치는 일치 항목을 찾지 않으므로 첫 번째 일치 항목이 해당 공간을 차지하면 패턴이 나머지 줄에서 다시 일치하지 않습니다. 그러나 입력이 이면 123 456 789
두 문자열 123␣
및가 ␣789
일치합니다.
사용하기가 더 쉬울 수 있습니다 grep -w
.
-w
,--word-regexp
전체 단어를 구성하는 일치 항목이 포함된 줄만 선택합니다. 테스트에서는 일치하는 하위 문자열이 줄의 시작 부분에 있거나 단어를 만들지 않는 문자가 앞에 있어야 한다는 것입니다.
$ echo '1341 5415 fdad' | grep -wE "[1-9]{1,5}" -o
1341
5415
또는 다음과 같이 grep하여 모든 공백을 두 배로 늘릴 수 있습니다.
$ echo '1341 5415 fdad' | sed -e 's/ / /g' | grep -E "(^|\s)[1-9]{1,5}($|\s)" -o
1341
5415
(또는 sed -e 's/\s/ /g'
sed에서 작동하는 경우)
후행 공백 1341
과 선행 공백이 있는 줄은 5415
일치 항목의 일부입니다.
답변3
한 가지 방법은 모든 공백을 줄 바꿈으로 변경한 다음 이를 사용하여 grep -x
표현식과 정확히 일치하는 줄을 선택하는 것입니다.
$ echo '1341 5415 fdad' | tr -s '[:space:]' '[\n*]' | grep -xE -e '[1-9]{1,5}'
1341
5415