이 XML을 정렬하는 방법은 무엇입니까?
- 알파벳순으로 첫 번째:
module
beforeproperty
. - 그런 다음 속성 이름을 알파벳순으로 지정
<module name="ClassTypeParameterName"/>
합니다<module name="PackageName"/>
.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE module PUBLIC "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN" "https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
<property name="severity" value="error"/>
<property name="fileExtensions" value="java"/>
<module name="NewlineAtEndOfFile"/>
<module name="FileTabCharacter"/>
<module name="TreeWalker">
<module name="PackageName"/>
<module name="ClassTypeParameterName"/>
<module name="InterfaceTypeParameterName"/>
<module name="MethodTypeParameterName"/>
<module name="LambdaParameterName"/>
<module name="PatternVariableName"/>
<module name="RecordComponentName"/>
<module name="RecordTypeParameterName"/>
<module name="TypeName">
<property name="format" value="^[A-Z][_a-zA-Z0-9]*$"/>
</module>
<module name="AvoidDoubleBraceInitialization"/>
<module name="AvoidNoArgumentSuperConstructorCall"/>
<module name="OneTopLevelClass"/>
<module name="OuterTypeFilename"/>
</module>
</module>
xq
여기에 사용된 것을 사용하고 싶습니다 .UNIX에서 Bash 스크립트를 사용하여 XML 파일을 정렬하시나요?
답변1
아마도 다음과 같은 것을 원할 것입니다.
xq -x -S 'walk(if type == "array" then sort_by(."@name") else . end)' file
-S
(또는 )을 사용하면 키가 키 앞에 오도록 --sort-keys
이름을 기준으로 키(XML 태그)를 정렬합니다 .module
property
그런 다음 각 배열에 적용되는 재귀 함수를 사용하여 walk()
속성 값( 로 작성됨)을 기준으로 sort_by()
각 배열의 요소를 정렬합니다 .name
."@name"
이 walk()
사용법은 다음과 거의 동일합니다.jq
매뉴얼의 예.
그러면 다음과 같은 출력이 생성됩니다.
<module name="Checker">
<module name="FileTabCharacter"></module>
<module name="NewlineAtEndOfFile"></module>
<module name="TreeWalker">
<module name="AvoidDoubleBraceInitialization"></module>
<module name="AvoidNoArgumentSuperConstructorCall"></module>
<module name="ClassTypeParameterName"></module>
<module name="InterfaceTypeParameterName"></module>
<module name="LambdaParameterName"></module>
<module name="MethodTypeParameterName"></module>
<module name="OneTopLevelClass"></module>
<module name="OuterTypeFilename"></module>
<module name="PackageName"></module>
<module name="PatternVariableName"></module>
<module name="RecordComponentName"></module>
<module name="RecordTypeParameterName"></module>
<module name="TypeName">
<property name="format" value="^[A-Z][_a-zA-Z0-9]*$"></property>
</module>
</module>
<property name="fileExtensions" value="java"></property>
<property name="severity" value="error"></property>
</module>
xq
빈 노드에 대해서도 닫는 마커가 명시적으로 작성된다는 점에 유의하세요 . 문제를 해결하려면( <tag attr="..."></tag>
로 변경 <tag attr="..."/>
) 결과를 xmlstarlet fo
또는 에 전달하세요 xmlstarlet format
.
참고로 원본 XML 문서에서 정렬 없이 변환된 JSON 문서와 jq
표현식이 적용된 JSON 문서는 다음과 같습니다.
{
"module": {
"@name": "Checker",
"module": [
{ "@name": "NewlineAtEndOfFile" },
{ "@name": "FileTabCharacter" },
{
"@name": "TreeWalker",
"module": [
{ "@name": "PackageName" },
{ "@name": "ClassTypeParameterName" },
{ "@name": "InterfaceTypeParameterName" },
{ "@name": "MethodTypeParameterName" },
{ "@name": "LambdaParameterName" },
{ "@name": "PatternVariableName" },
{ "@name": "RecordComponentName" },
{ "@name": "RecordTypeParameterName" },
{
"@name": "TypeName",
"property": { "@name": "format", "@value": "^[A-Z][_a-zA-Z0-9]*$"
},
{ "@name": "AvoidDoubleBraceInitialization" },
{ "@name": "AvoidNoArgumentSuperConstructorCall" },
{ "@name": "OneTopLevelClass" },
{ "@name": "OuterTypeFilename" }
]
}
],
"property": [
{ "@name": "severity", "@value": "error" },
{ "@name": "fileExtensions", "@value": "java" }
]
}
}
답변2
나는 OP와 매우 유사한 문제에 직면했고(온라인 도구를 제외한 고객 데이터를 포함하는 xml에 문제가 추가됨) 먼저 xq
이 스크립트를 시작점으로 사용하여 상당한 성공을 거두었습니다.https://unix.stackexchange.com/a/659245/367314.
vscode
그러나 마침내 코드 블록을 정렬하고 깊이를 구성할 수 있는 멋진 플러그인을 찾았습니다 . 다른 사람에게 도움이 될까 해서 여기에 글을 올리겠다고 생각했어요.
https://marketplace.visualstudio.com/items?itemName=1nVitr0.blocksort
파일의 특정 블록만 정렬하려는 경우 UI에서 해당 블록을 선택하고 관심 있는 블록만 정렬하거나 전체 문서를 스마트 정렬할 수 있습니다.
자동화하려는 경우 좋은 솔루션은 아니지만 일회성으로는 좋습니다.