sed 정규식을 사용하여 숫자 부분만 캡처

sed 정규식을 사용하여 숫자 부분만 캡처

다음은 왜 작동하지 않습니까?

INTERNAL_NUM=$(grep -E '\s*internal_num\s*=' file.xml |sed -E 's/internal_num\s*=\s*([0-9]\+)/\1/') 
echo "$INTERNAL_NUM"

실제 숫자를 인쇄하고 싶지만 다음과 같이 인쇄됩니다.

internal_num = 1234 

명령 grep은 을 인쇄하므로 internal_num = 1234해당 부분은 정상입니다. sed작동하지 않는 파이프 입니다 .

답변1

GNU grep이 있다면 다음과 같이 작성할 수 있습니다.

grep -oP '\binternal_num\s*=\s*\K\d+' file.xml

하지만 정규식을 사용하여 XML을 구문 분석하면 안 됩니다. 어쩌면 이런 것이 필요할 수도 있습니다.

$ echo '
      <root>
          <tag>
              <tag>
                  <wanted internal_num="1234" />
                  <wanted internal_num = "5678" />
              </tag>
          </tag>
      </root>
  ' | xmlstarlet sel -t -v '//@internal_num' -n
1234
5678

입력 파일을 보여주세요.

답변2

다양한 도구와 특정 도구의 구현/버전은 다양한 정규식 구문을 지원합니다.

이식성을 위해 POSIX 기능 세트로 제한할 수 있습니다.

s=[[:space:]]
sed -n "s/^\(.*$s\)\{0,1\}internal_num$s*=$s*\([0-9]\{1,\}\).*/\2/p"

(각 줄이 한 번만 나타난다고 가정)

grepGNU를 지원하는 시스템에서만 실행 -o하고 (펄과 유사한 정규식의 경우) 다음을 수행 할 수 있다는 것을 알고 있다면 다음과 같이 할 수 있습니다.-Pgrep

grep -Po '(?<!\S)internal_num\s*=\s*\K\d+'

답변3

확장 정규식을 사용하고 있지만 여전히 이스케이프 처리하고 \+있으므로 리터럴 더하기 기호를 찾고 교체를 호출하지 않습니다.

노력하다,

INTERNAL_NUM=$(grep -E '\s*internal_num\s*=' file.xml |sed -E 's/internal_num\s*=\s*([0-9]+)/\1/') 
echo "$INTERNAL_NUM"

테스트 사례(GNU sed V4.2.1에서 테스트됨):

$ echo "internal_num = 1234" | sed -E 's/internal_num\s*=\s*([0-9]\+)/\1/'
internal_num = 1234

$ echo "internal_num = 1234" | sed -E 's/internal_num\s*=\s*([0-9]+)/\1/'
1234

다른 답변에서 언급하고 자세히 설명했듯이 정규식을 사용하여 XML을 구문 분석하지 않는 것을 진지하게 고려해야 합니다.

관련 정보