awk, grep 및/또는 powershell을 사용하여 여러 줄을 필터링하는 방법

awk, grep 및/또는 powershell을 사용하여 여러 줄을 필터링하는 방법

내 상황은 내용이 아래와 같지만 더 긴 파일이 있다는 것입니다.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)"))]선택합니다 .gameromname아니요문자열을 포함합니다 (USA). 삭제를 위해 선택되었습니다.

명령줄에서 리디렉션을 사용하여 출력을 새 파일에 씁니다.

XML 데이터를 간략하게 살펴본 후 노드를 볼 필요는 없으며 기본 노드의 속성만 보면 rom충분하다는 것을 알았습니다.gamename

xmlstarlet ed -d '//game[not(contains(@name, "(USA)"))]' file-orig.xml >file-new.xml

(USA)이렇게 하면 노드 속성에 포함되지 않은 모든 게임이 제거됩니다 .namegame

제목이 아닌 항목을 모두 제거하면 다운로드한 파일에 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

관련 정보