파일에서 중복된 태그 인스턴스 찾기

파일에서 중복된 태그 인스턴스 찾기

파일에는 다음과 유사한 여러 코드 조각이 있습니다.

<blah>Spread the peanut butter <ramout assot="f0123_fun10" bapel="2 or 6"/> on good looking bread <ramout assot="f0123_fun10" bapel="3 or 5"/> that does not have peanut butter <ramout assot="f0123_fun10" bapel="2 or 6"/> already on the bread this that and the other <ramout assot="f0123_fun10" bapel="4"/> with something else.</blah>

단일 파일 내에서 ramout 태그의 중복 인스턴스를 찾으려고 합니다. 다음 조건이 존재하는 경우:

<ramout assot="f0123_fun10" bapel="2 or 6"/> 

처음과 끝의 헛소리 태그에서 다시 반복되는지 궁금합니다.

여러 가지 방법을 시도했지만 최신 방법 중 하나는 다음과 같습니다.

grep -Eoi '<blah>.*([[:space:]]<ramout assot).*\1.*</blah>' *.xml | less

아무것도 반환되지 않습니다.

나는 또한 다음을 시도했습니다.

 grep -Eio '<blah>.*([[:space:]]<ramout assot="[a-z][0-9]{5}_fig[0-9]+" bapel="[0-9]+.*)' *.xml

역참조는 포함되지 않지만 모든 결과가 표시되는 것은 아닙니다. 이는 하나의 행에 대한 결과만 표시하는 것 같습니다(둘 이상의 행에 걸쳐 있지 않음).

한 줄에 있을 수도 있고 없을 수도 있는 것을 검색하려면 sed를 사용해야 합니까?

awk가 실행 가능한 후보인가요? 보고 시도했습니다. awk '/Startpattern/,/Endpattern/' filename은 더 많은 결과를 반환했지만 여전히 모두 얻지 못했습니다.

a) 전체 파일의 모든 결과와 개별적으로 b) blah 태그 내에서 반복되는 모든 결과를 찾는 데 도움을 주시면 대단히 감사하겠습니다.

예상 결과는 다음과 유사합니다.

검색 결과 a) 모든 Ramout 결과 표시:

<ramout assot="f0123_fun10" bapel="2 or 6"/>
<ramout assot="f0123_fun10" bapel="3 or 5"/>
<ramout assot="f0123_fun10" bapel="2 or 6"/>
<ramout assot="f0123_fun10" bapel="4"/>

b) 중복 결과를 표시하는 검색 결과는 다음과 같습니다.

<ramout assot="f0123_fun10" bapel="2 or 6"/>

답변1

사용XML 스타(때때로 으로 설치되는 xmlstarlet경우도 있음 xml) 관련 태그를 추출한 다음 중복 항목을 sort찾습니다 uniq.

$ xml sel -t -m '/blah/ramout' -c '.' -nl test.xml | sort | uniq -d
<ramout assot="f0123_fun10" bapel="2 or 6"/>

이 명령은 이 태그 바로 아래의 모든 태그를 xml일치시키고 각 태그를 표준 출력에 복사한 다음 개행 문자를 복사합니다.<ramout><blah>

sortuniq -d의 출력에서 ​​중복 항목을 정렬하고 추출합니다 sort.

답변2

내 테스트에서는 다음과 같은 것이 잘 작동합니다.

awk -F"/>" -v RS="<ramout assot=" 'NR>1{print RS $1 FS}' file1

echo "Finding Cuplicates:"
awk -F"/>" -v RS="<ramout assot=" 'NR==1{next}seen[$1]++==1{print RS $1 FS}' file1

<ramout assot="f0123_fun10" bapel="2 or 6"/> 
<ramout assot="f0123_fun10" bapel="3 or 5"/> 
<ramout assot="f0123_fun10" bapel="2 or 6"/>
<ramout assot="f0123_fun10" bapel="4"/> 
Finding Cuplicates:              
<ramout assot="f0123_fun10" bapel="2 or 6"/>  

여기에서 온라인으로 테스트해 보세요.

우리는 awk 기능을 사용하여 사용자 정의 레코드 구분 기호(RS)와 사용자 정의 필드 구분 기호(FS)를 선언합니다. 위의 두 명령을 하나의 awk로 결합할 수 있습니다. 이는 단지 테스트일 뿐입니다.

관련 정보