XML 요소를 구별하기 위해 태그 이름에 숫자 접미사를 추가합니다.

XML 요소를 구별하기 위해 태그 이름에 숫자 접미사를 추가합니다.

태그 이름이 동일한 여러 하위 요소가 포함된 XML 파일이 있습니다. <Name>Luigi</Name>, <Name>Mario</Name>, <Name>Peach</Name>. 이것은 내 입력 파일의 모델입니다.

<!-- names.xml -->
<Names>
    <Name>Luigi</Name>
    <Name>Mario</Name>
    <Name>Peach</Name>
</Names>

분석을 위해 이 파일을 Excel에 넣으면 Name각 요소에 대한 새 레코드가 생성됩니다. 이는 가독성 측면에서는 훌륭하지만 이름 필드 외부에 반복되는 데이터가 많이 있는지 확인하기 어렵습니다.

내가 하고 싶은 일은 레이블의 이름을 으로 바꾸는 것입니다 Name1. Name2그러면 Name3레이블을 Excel로 가져올 때 모두 같은 행에 표시됩니다. 이렇게 하면 원본 데이터를 계속해서 볼 필요 없이 나에게 쓸모가 없거나 중복 항목이 포함된 레코드를 찾을 수 있습니다.

즉, 다음과 같은 출력을 생성하는 스크립트나 명령이 필요합니다.

<!-- names.xml -->
<Names>
    <Name1>Luigi</Name1>
    <Name2>Mario</Name2>
    <Name3>Peach</Name3>
</Names>

이것을 사용하여 이것을 할 수 있습니까?sed명령이나 다른 Unix 스크립트?

답변1

귀하가 구체적으로 요청했으므로 각 요소가 같은 줄에서 열리고 닫히는 경우 원하는 작업을 수행하는 / 스크립트 sed는 다음과 같습니다 .sedbash<Name>

(IFS='';
n=0;
while read line; do
    if echo "${line}" | grep -Pq "<Name>\w+</Name>"; then
        ((n++));
        echo "${line}" | sed "s/<Name>\(\w\+\)<\/Name>/<Name${n}>\1<\/Name${n}>/";
    else
        echo "${line}";
    fi;
done) < names.xml

다음 입력 파일로 테스트했습니다.

<!-- names.xml -->
<Names>
    <Name>Luigi</Name>
    <Name>Mario</Name>
    <Name>Peach</Name>
</Names>

다음과 같은 출력이 생성되었습니다.

<Names>
    <Name1>Luigi</Name1>
    <Name2>Mario</Name2>
    <Name3>Peach</Name3>
</Names>

즉, 이는 XML 구문 분석 라이브러리가 있는 언어에 적합한 후보인 것 같습니다. 원하는 작업을 수행하는 Python 스크립트는 다음과 같습니다.

#!/usr/bin/env python2
# -*- encoding: ascii -*-

# add_suffix.py

import sys
import xml.etree.ElementTree

# Load the data
tree = xml.etree.ElementTree.parse(sys.argv[1])
root = tree.getroot()

# Update the XML tree
suffix = 0
for name in root.iter("Name"):
    suffix += 1
    name.tag += str(suffix)

# Write out the updated data
tree.write(sys.argv[2])

다음과 같이 실행하세요:

python add_suffix.py names.xml new_names.xml

관련 정보