파일에는 다음과 유사한 여러 코드 조각이 있습니다.
<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>
sort
uniq -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로 결합할 수 있습니다. 이는 단지 테스트일 뿐입니다.