다음은 왜 작동하지 않습니까?
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"
(각 줄이 한 번만 나타난다고 가정)
grep
GNU를 지원하는 시스템에서만 실행 -o
하고 (펄과 유사한 정규식의 경우) 다음을 수행 할 수 있다는 것을 알고 있다면 다음과 같이 할 수 있습니다.-P
grep
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을 구문 분석하지 않는 것을 진지하게 고려해야 합니다.