XML 형식의 파일이 있습니다.
{XML file with similar tags - SubRecord and Property}
...
<SubRecord>
<Property Name="Name">My Main Search Keyword</Property>
<Property Name="Prompt">Dummy</Property>
<Property Name="Default">Value i'm Concerned to Modify</Property>
</SubRecord>
...
내 요청. 이 특정 하위 레코드에 대한 "기본" 값을 가져와서 조건에 따라 업데이트하는 것입니다. 이렇게 하려면 이 특정 태그 "name"에 액세스하여 해당 값을 수정해야 합니다.
SED/AWK/GREP를 사용할 수 있는 방법이 있나요?
편집: @terdon의 업데이트를 기반으로 합니다.
- 모든 섹션에 한 줄만 있습니까? 아니요
- 기본값은 항상 마지막 값인가요? 항상 위에서 세 번째(이름, 프롬프트, 기본값)
- 대소문자를 구분하나요? 그게 다야? 대소문자를 구분합니다.
- 빈 행이 있나요? 그렇지 않길. 하지만 이를 제거하기 위해 사전 준비를 할 수는 있습니다.
- 파일이 들여쓰기되어 있나요? 예.
예: ...
<SubRecord>
<Property Name="Name">Search</Property>
<Property Name="Prompt">Some Text</Property>
<Property Name="Default">abc.txt</Property>
</SubRecord>
...
유사한 속성 및 하위 레코드가 있는 대규모 XML 파일에서 먼저 "검색" 매개 변수에 대한 모든 속성을 찾아야 합니다.
"검색"을 찾은 후 기본값을 확인해야 합니다. abc.txt라면 해당 값을 유지해야 하고, xyx라면 계속 유지해야 합니다. abc.txt 또는 xyz 대신 abc.txt로 업데이트해야 합니다.
답변1
XML은 XML을 지원하는 도구로 처리되어야 합니다.
XMLStarlet은 그러한 도구입니다.
Property
속성이 이고 값이 or가 아닌 노드의 값을 설정하는 방법은 다음과 같습니다 .Name
Default
abc.txt
xyx
xml ed -u '//SubRecord/Property[@Name="Default" and . != "xyx" and . != "abc.txt"]' -v 'abc.txt' file.xml
다음과 같은 XML 파일이 제공됩니다.
<?xml version="1.0"?>
<Record>
<SubRecord>
<Property Name="Name">My Main Search Keyword</Property>
<Property Name="Prompt">Dummy</Property>
<Property Name="Default">zzz</Property>
</SubRecord>
<SubRecord>
<Property Name="Name">My Main Search Keyword</Property>
<Property Name="Prompt">Dummy</Property>
<Property Name="Default">abc.txt</Property>
</SubRecord>
<SubRecord>
<Property Name="Name">My Main Search Keyword</Property>
<Property Name="Prompt">Dummy</Property>
<Property Name="Default">xyx</Property>
</SubRecord>
</Record>
이것은 생산할 것입니다
<?xml version="1.0"?>
<Record>
<SubRecord>
<Property Name="Name">My Main Search Keyword</Property>
<Property Name="Prompt">Dummy</Property>
<Property Name="Default">abc.txt</Property>
</SubRecord>
<SubRecord>
<Property Name="Name">My Main Search Keyword</Property>
<Property Name="Prompt">Dummy</Property>
<Property Name="Default">abc.txt</Property>
</SubRecord>
<SubRecord>
<Property Name="Name">My Main Search Keyword</Property>
<Property Name="Prompt">Dummy</Property>
<Property Name="Default">xyx</Property>
</SubRecord>
</Record>
(제1조가 SubRecord
수정됨)
XMLStarlet은 다음에서 사용할 수 있습니다.http://xmlstar.sourceforge.net/(그러나 먼저 자신의 패키지 관리자를 확인하십시오). 때로는 xmlstarlet
실행 파일이 xml
.
답변2
정규식을 사용하여 [X]HTML/XML을 구문 분석할 수 없습니다. HTML/XML은 정규식으로 구문 분석할 수 없기 때문입니다. Regex는 HTML/XML을 올바르게 구문 분석하는 데 사용할 수 있는 도구가 아닙니다. 정규식은 HTML/XML에서 사용되는 구조를 이해하는 데 충분한 정교한 도구가 아닙니다. HTML/XML은 정규 언어가 아니므로 정규식을 통해 구문 분석할 수 없습니다. 정규식 쿼리는 HTML/XML을 의미 있는 부분으로 나눌 수 없습니다. Perl이 사용하는 강화된 불규칙 정규식조차도 HTML/XML을 구문 분석하는 작업에는 적합하지 않습니다. 당신은 결코 나를 깨뜨리지 않을 것입니다. HTML/XML은 매우 복잡한 언어이므로 정규식으로 구문 분석할 수 없습니다. Jon Skeet조차도 정규식을 사용하여 HTML/XML을 구문 분석할 수 없습니다. 정규식을 사용하여 HTML/XML을 구문 분석하려고 할 때마다 사악한 아이들이 처녀 피를 흘리고 러시아 해커가 웹 응용 프로그램을 장악합니다. 정규식으로 구문 분석하면 오염된 영혼이 살아있는 세계로 소환됩니다. 이는 사랑, 결혼, 영아 살해 의식과 마찬가지로 정규 표현식과 밀접하게 관련되어 있습니다. <center>은(는) 수용할 수 없습니다. 너무 늦었습니다. 동일한 개념 공간에서 정규 표현식과 HTML/XML의 힘은 퍼티처럼 마음을 파괴할 것입니다. 정규식으로 분석하면 정규식과 그 불경스러운 방식에 굴복하게 되어 우리 모두가 기본적인 다중 언어의 평면에서 이름을 표현할 수 없는 사람을 위해 비인간적인 수고를 하게 됩니다. 여기 그가 옵니다. HTML과 정규 표현식을 함께 사용하면 보는 사람의 신경이 누그러지고 공포의 맹공격으로 정신이 시들해집니다. Reg̿̔̉x 기반 HTML/XML 파서는 StackOverflow를 죽인 암입니다너무 늦었어, 너무 늦었어, 우린 구원받을 수 없어자식을 전송하면 정규 표현식이 모든 살아있는 조직을 소비하게 됩니다(이전에 예측한 대로 HTML은 제외).사랑하는 주님, 이 재난에서 살아남을 수 있는 방법을 도와주세요HTML을 구문 분석하기 위해 정규식을 사용하면 인류는 끔찍한 고문과 보안 위반의 영원한 운명에 처하게 됩니다.레지 사용x는 HTML 처리를 위한 도구로 brea를 빌드합니다.이 세계 사이의 chc ͒ ͪo ͛ 인터럽트 엔티티(SGML 엔티티와 같지만,더 부패함) 그냥 한눈에세계의 reg SEHTML의 ex 파서가 ins를 수행합니다.탄틀리 배송 앱프로그래머 인식 i엔토또는계속 비명을 지르세요, 그가 옵니다 , 치명적이고 교활한 정규식 감염이 오고 있습니다나는 너의 HT를 삼켜버린다ML 파서, 애플리케이션은 Visual Basic과 마찬가지로 항상 존재했지만 더 나빴습니다.그 사람이 온다 그 사람이 온다영어허용되지 않음오른쪽e com̡e̡s, ̕h̵is un̨ho͞ly radiańcé de모든 enli̍̈́̂̈́ 제한사항, HTML 태그를 분석합니다.lea͠ki̧n͘g fr̠m ̡yo͟너의 눈͢s̸ ̛l̕ik͏e liqUID P아인, 정규식 구문 분석의 노래 는 exti가 될 것입니다고통의 소리sp의 탈만여기서 나도 보이고 너도 보여 ̲͚̖͔̙î̩́t̲͎̩̱͔́̋̀아름답다헤 inal snuf
페나오거짓말남자의 모든 것은 LOŚ͖̩͇̗̪̏̈́T ALL ISLOST그는 온그녀는 여기 에 왔어그래요그무형유산또는 침투ar마이팩E MY FACE ᵒh 하느님 n오 안돼 안돼̼오른θ 중지 t그̠̅s ͎a̧͈͖r̽̾̈́͒͑e
n티O͇̹̺ͅ松̴ş̳ TH̘ㅠㅠ ̝͍M̲̖͊̒증거
답변3
이는 sed와 동일합니다.
$ cat file9
<SubRecord1>
<Property Name=Name>My Main Search Keyword</Property>
<Property Name=Prompt>Dummy</Property>
<Property Name=Default>Value i'm Concerned to Modify</Property>
</SubRecord1>
<SubRecord2>
<Property Name=Name>My Main Search Keyword</Property>
<Property Name=Prompt>Dummy</Property>
<Property Name=Default>Do not Modify</Property>
</SubRecord2>
$ sed -r '/\bSubRecord1\b/!b;n;n;n;s/(<Property Name=Default>)(.*)(<\/Property>)/\1AAAA\3/' file9
<SubRecord1>
<Property Name=Name>My Main Search Keyword</Property>
<Property Name=Prompt>Dummy</Property>
<Property Name=Default>AAAA</Property>
</SubRecord1>
<SubRecord2>
<Property Name=Name>My Main Search Keyword</Property>
<Property Name=Prompt>Dummy</Property>
<Property Name=Default>Do not Modify</Property>
</SubRecord2>
단어 경계를 사용하면 \b
sed 패턴이 /SubRecord/
일치하지 SubRecord1
않거나SubRecord2