내 상황은 내용이 아래와 같지만 더 긴 파일이 있다는 것입니다.https://pastebin.com/q33wFdAX
다음 항목을 모두 제거해야 합니다.
<category>Games</category>
</game>
카테고리에 데이터가 있으면 삭제하고 싶지 않습니다. 따라서 기본적으로 grep -v와 같이 이 이중 라인을 정확하게 일치시키고 이를 반대로 할 수 있다면 해당 라인 없이 새 파일로 출력할 수 있습니다.
나는 이 범주보다 더 많은 것을 가질 것이므로 여러 개의 또는 문을 사용할 수 있어야 합니다. 이 작업을 수동으로 수행하기 위해 메모장++에서 사용한 정규식의 예
(^\s+<category>Games</category>\s+</game>$|^\s+<category>Applications</category>\s+</game>$)
Powershell에서 이 작업을 쉽게 수행할 수 있는 방법을 알려 주시면 두 운영 체제 모두에서 이 작업을 수행할 수 있으면 좋겠습니다. 나는 고급 정규식, awk 등에 능숙하지 않습니다.
답변1
주어진이것원래문서, 다음은 (USA)
제목 노드 속성 rom
에 언급되지 않은 모든 제목을 제거합니다 name
.
xmlstarlet ed -d '//game[not(contains(rom/@name, "(USA)"))]' file-orig.xml >file-new.xml
XPath 표현식은 다음 속성을 가진 하위 노드가 하나 이상 있는 모든 노드를 //game[not(contains(rom/@name, "(USA)"))]
선택합니다 .game
rom
name
아니요문자열을 포함합니다 (USA)
. 삭제를 위해 선택되었습니다.
명령줄에서 리디렉션을 사용하여 출력을 새 파일에 씁니다.
XML 데이터를 간략하게 살펴본 후 노드를 볼 필요는 없으며 기본 노드의 속성만 보면 rom
충분하다는 것을 알았습니다.game
name
xmlstarlet ed -d '//game[not(contains(@name, "(USA)"))]' file-orig.xml >file-new.xml
(USA)
이렇게 하면 노드 속성에 포함되지 않은 모든 게임이 제거됩니다 .name
game
제목이 아닌 항목을 모두 제거하면 다운로드한 파일에 1979개의 제목이 포함됩니다 (USA)
.
카테고리 가 아닌 모든 항목을 추가로 필터링하려면 다음을 수행하세요 Games
.
xmlstarlet ed \
-d '//game[not(contains(@name, "(USA)"))]' \
-d '//game[category != "Games"]' file-orig.xml >file-new.xml
그러면 1474개의 게임 타이틀이 남습니다.
재미를 위해 총 게임 타이틀 수에 따라 게임 제목을 정렬하세요.크기:
xmlstarlet ed \
-d '//game[not(contains(@name, "(USA)"))]' \
-d '//game[category != "Games"]' file-orig.xml |
xmlstarlet sel -t -m '//game' \
-v 'sum(rom/@size)' -o ' ' -v '@name' -nl | sort -n