임의의 텍스트 뒤에 콜론( :
)과 공백, 숫자 결과, 또 다른 공백 및 기타 임의의 텍스트가 있습니다. 예를 들면 다음과 같습니다.
text: 30 (5 new)
예를 들어 숫자를 추출하면 됩니다 30
.
30
현재 다음 코드만 가지고 있습니다.
sed 's/.*: //g'
이것은 나에게 다음과 같은 결과를 제공합니다.
30 (5 new)
내가 무엇을 놓치고 있나요?
답변1
표현식( 's/.*: //g'
)은 첫 번째 부분을 제거하고 나머지는 모두 유지합니다. 그러면 전체 줄이 원하는 숫자가 포함된 부분으로 대체됩니다.
sed -re 's/^.*: ([0-9]+) .*$/\1/'
세부사항: ^.*:
은 첫 번째 부분(줄의 시작 부분에 해당)이고, 번호는 다음이며 ([0-9]+)
, 나중에 사용할 수 있는 그룹을 정의하기 위해 괄호 안에 있고, 마지막으로 끝까지 줄의 나머지 부분입니다: .*$
. 그런 다음 이를 첫 번째 그룹으로 바꿉니다(하나만 있음).\1
답변2
어쩌면 다음과 같은 것일 수도 있습니다.
$ echo "text: 30 (5 new)" | sed -e 's/^.*: \([0-9][0-9]*\).*$/\1/'
30
그것을 파괴:
^.*:
줄의 시작 부분부터 시작하여 콜론과 공백으로 끝나는 모든 문자와 일치합니다.\([0-9][0-9]*\)
숫자를 일치시킵니다 . 괄호는 나중에 참조할 수 있는 그룹을 정의합니다..*$
줄 끝의 문자 수와 일치합니다 .
s
전체 패턴을 \1
첫 번째 그룹(즉, 괄호 - 숫자로 정의한 그룹)의 내용인 ( )로 대체 합니다 .
답변3
숫자 뒤에 무엇이 올지 전혀 모릅니다. 가능하다면 또 다른 콜론이 있습니다. 예를 들어,
eggs: 42 (from: 17 hens)
그러면 다른 답변이 주어질 것입니다
17
. 그게 당신이 원하는 거라면 괜찮습니다. (하지만 제발요.편집하다귀하의 질문은 귀하가 원하는 것을 알려줍니다.) 다음 번호를 원하시면첫 번째콜론을^[^:]*
대신 사용하세요^.*
."숫자 결과"가 무엇인지에 대해 부정확합니다. 다음과 같은 경우가 있을 수 있습니다.
balance: 609.83 (I’m running low on money) balance: -17.42 (overdraft!)
- 먼저 부탁드립니다편집하다귀하의 질문은 귀하의 숫자가 어떻게 생겼는지 나타내는 것입니다.
귀하의 질문 제목은 "두 문자 사이"입니다. 숫자 결과(그것이 무엇이든) 뒤에 공백이 따른다는 것을 보장하는 경우(그리고 그렇지 않음)포함하다어떤 공백이라도! ),그 다음에
sed 's/^[^:]*: \([^ ]*\).*/\1/'
아마도 가장 간단한 해결책일 것입니다. 그러면 뒤에 나오는 공백이 아닌 문자가 모두 캡처됩니다
:
. 이는 숫자가 줄 끝에 있는 경우(공백이 뒤따르지 않는 경우)를 처리합니다.Blind mice: 3
(알아채다앤디 달튼의 답변 숫자가 줄 끝에 있는 경우도 처리합니다. )
답변4
다음 2가지 방법을 시도해 볼 수 있습니다.
첫 번째 방법은 awk를 사용합니다.
awk '{print $2}' filename