정규식을 사용하여 문자열에서 모든 숫자와 IP를 얻는 방법은 무엇입니까?

정규식을 사용하여 문자열에서 모든 숫자와 IP를 얻는 방법은 무엇입니까?

다음과 같은 예제 문자열이 있다고 가정해 보겠습니다.

<ETH0_IP><![CDATA[10.0.100.10]]></ETH0_IP>

제 생각에는정제이것첫 번째 숫자 그리고이것지적 재산권다음 형식을 사용하세요.

0 10.0.100.10

sed 's@^[^0-255]*\([0-255]\+\).*@\1@'첫 번째 ( ) 번호와 IP ( grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')를 추출하는 방법을 알고 있지만그 당시에는단 한 줄로 달성할 수 있는지 알고 싶습니다.

답변1

모든(정수) 숫자와 모든 IP(v4) 주소가 필요한 경우 grep을 사용하여 정규식에 대체 항목을 추가하세요.

... | grep -oE '[0-9]+|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

이렇게 하면 한 줄에 하나의 값이 인쇄되고 물론 끝 0부터 캡처됩니다.ETH0


위와 유사한 구조의 숫자와 IP를 포함하는 입력 라인만 필요한 경우(다른 구조는 필요하지 않음), 예를 들어 sed를 사용할 수 있습니다.

... | sed -nEe 's,.*<ETH([0-9]+)_IP><!\[CDATA\[([0-9.]+)\]\]></ETH[0-9]+_IP>.*,\1 \2,p'

\1그리고 괄호 안의 첫 번째와 두 번째 그룹에 해당하는 것은 \2명확성과 게으름을 위해 여기에 IP를 일치시켰습니다.[0-9.]+


또는 Perl에서도 유사합니다:

... | perl -ne 'print "$1 $2\n" if m,<ETH([0-9]+)_IP><!\[CDATA\[([0-9.]+)\]\]></ETH[0-9]+_IP>,'

답변2

숫자가 아닌("." 아님) 문자를 모두 공백으로 바꾸면 첫 번째와 두 번째 열을 인쇄할 수 있습니다.

echo '<ETH0_IP><![CDATA[10.0.100.10]]></ETH0_IP>' | \
   sed -re 's;[^0-9.]; ;g' | \
   awk '{print $1,$2}'

산출:

0 10.0.100.10

추신: "."이 있으면 더 복잡하게 만들어야 합니다. IP뿐만 아니라 다른 곳에서도 마찬가지입니다.

답변3

사용 xq(부터https://kislyuk.github.io/yq/), 입력이 실제로 질문의 단일 XML 노드라고 가정합니다.

xq -r 'to_entries[] | [ (.key|ltrimstr("ETH")|rtrimstr("_IP")), .value ] | @tsv' file.xml

이는 XML 문서를 JSON으로 변환한 다음 태그 이름 ETH의 시작과 끝을 _IP제거하여 나머지 태그 이름을 추출합니다 . IP 주소도 추출되어 결과 값 2개가 탭으로 구분된 목록으로 출력됩니다.

ltrimstr()호출은 rtrimstr()레이블 이름에서 숫자가 아닌 모든 문자를 제거하는 or로 대체될 수 있습니다.gsub("[^[:digit:]]"; ""))gsub("\\D"; ""))

중간 JSON 문서는 다음과 같습니다.

{
  "ETH0_IP": "10.0.100.10"
}

...최종 출력은 다음과 같습니다.

0       10.0.100.10

관련 정보