<>를 포함하는 특정 패턴 사이의 문자를 인쇄합니다.

<>를 포함하는 특정 패턴 사이의 문자를 인쇄합니다.

여러분의 도움을 요청합니다.

많이 찾아보고 awk와 sed를 사용하여 몇 가지 테스트를 수행했지만 제대로 작동하지 않습니다. 아래는 구성 파일의 일부입니다. grep을 통해 출력을 얻을 수 있지만 필요한 방식은 아닙니다.

> file.txt
> 
> "<property>name="DBName"><value>ABC</value>name="DBName"><value>DEF</value></property>
> 
> cat file.xml | grep -o -P '.name="DBName"><value>.{0,20}'
> name="DBName"><value>ABC</value>
> name="DBName"><value>DEF</value></propert

원하는 출력은 다음과 같습니다.

ABC
DEF

도움을 주셔서 감사합니다.

그리고 나

답변1

만약 (거대하고 거대한 "if") 당신의 파일이 실제로 당신이 원하는 매우 간단한 경우만을 가지고 있다면정밀한string <value>뒤에는 -문자가 아닌 문자가 오고 <, 따라서 질문은 " </value>각 항목과 그 뒤의 첫 번째 항목 사이에 있는 간단한 비줄바꿈 문자열을 얻습니다."로 공식화할 수 있으며 다음을 수행할 수 있습니다( GNU 사용):<value><grep

grep -oP '<value>\K[^<]+' file

물론 이것은 약간 다르게 실패할 수도 있습니다. 예를 들어, 여러 행의 값이 있거나 값 태그에 <value foo=bar>또는 같은 것이 있을 수 있는 경우 이는 완벽하게 유효한 다른 여러 XML 상황에서도 작동합니다. 올바른 방법은 XM: 파서를 사용하는 것입니다. 확인하고 싶을 수도 있습니다xmllint또는XML 스타다른 것들 사이.

답변2

모든 입력이 게시한 예제 입력의 한 줄과 정확히 일치하는 경우:

$ cat file
"<property>name="DBName"><value>ABC</value>name="DBName"><value>DEF</value></property>

그런 다음 awk를 사용하십시오.

$ awk -F'[<>]+' '{for (i=5; i<=NF; i+=4) print $i}' file
ABC
DEF

그러나 XML 파서를 사용하지 않는 다른 솔루션과 마찬가지로 이 솔루션도 취약합니다.

답변3

사용 XMLStarlet:

다음에서 가져온 XML 파일답변.

<config>
 <property name="DBName"><value>ABC</value></property>
 <property name="DBName" year="2023"><value>DEF</value></property>
 <property name="SystemName"><value>s70</value></property>
</config>
$ xmlstarlet select -t -v '//value' --nl ex.xml
ABC
DEF
s70

$ xmlstarlet select -t -m '//property[@name="DBName"]' -v 'value' --nl ex.xml
ABC
DEF

awk를 사용하세요:

$ awk -v pat1="<value>" -v pat2="</value>" '
   {
       while (match($0, pat1)){ 
           $0=substr($0,RSTART+RLENGTH);
           if (match($0, pat2)) print substr($0,1,RSTART-1)
       }
   }
'

문제에 대한 솔루션이 awk작동 하지만 많은 경우 실패할 수 있습니다.pcregrep

$ pcregrep -o1 '<value>(.*?)</value>'

답변4

우리와 같이 올바른 형식의 XML 입력이 있는 경우

<config>
 <property name="DBName"><value>ABC</value></property>
 <property name="DBName" year="2023"><value>DEF</value></property>
 <property name="SystemName"><value>s70</value></property>
</config>

XML 인식 도구를 사용하고 Xpath(또는 유사한 도구)를 사용하여 추출할 부분을 선택할 수 있습니다. 예는 다음과 같습니다히델:

## 1) get all values:
$ xidel -e "//value" ex.xml 
ABC
DEF
s70
## 2) get the values inside "property" with attribute "name" "DBname"
$ xidel -e "//property[@name='DBname']/value" ex.xml 
ABC
DEF

관련 정보