sed를 사용하여 두 문자 사이의 숫자를 추출하는 방법은 무엇입니까?

sed를 사용하여 두 문자 사이의 숫자를 추출하는 방법은 무엇입니까?

임의의 텍스트 뒤에 콜론( :)과 공백, 숫자 결과, 또 다른 공백 및 기타 임의의 텍스트가 있습니다. 예를 들면 다음과 같습니다.

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

  1. 숫자 뒤에 무엇이 올지 전혀 모릅니다. 가능하다면 또 다른 콜론이 있습니다. 예를 들어,

    eggs: 42 (from: 17 hens)
    

    그러면 다른 답변이 주어질 것입니다 17. 그게 당신이 원하는 거라면 괜찮습니다. (하지만 제발요.편집하다귀하의 질문은 귀하가 원하는 것을 알려줍니다.) 다음 번호를 원하시면첫 번째콜론을  ^[^:]*대신  사용하세요 ^.*.

  2. "숫자 결과"가 무엇인지에 대해 부정확합니다. 다음과 같은 경우가 있을 수 있습니다.

    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

관련 정보