sed
저는 Linux를 사용하고 있는데 이를 사용하여 두 태그 사이의 슬래시( )를 제거하고 싶습니다 . /
따라서:
<file>/text</file>
<file>/text2</file
<file>/text</file>..
이와 관련하여
<file>text</file>
<file>text2</file
<file>text</file>..
성공 사례 없이 많은 코드를 테스트했습니다.
sed s'/<file>/s|^\.{1,2}/||' fileout
도와주세요?
답변1
다음과 같은 올바른 형식의 XML 파일이 제공됩니다.
<?xml version="1.0"?>
<root>
<file>/text</file>
<file>/text2</file>
<file>/text</file>
<file>other text</file>
</root>
file
...값이 다음으로 시작하는 경우 XMLStarlet을 사용하여 각 노드 값의 첫 번째 문자를 제거할 수 있습니다 /
.
xmlstarlet edit \
--update '//file[starts-with(text(), "/")]' \
--expr 'substring(text(), 2)' \
myfile.xml
또는 더 짧은 구문을 사용하면
xmlstarlet ed \
-u '//file[starts-with(text(), "/")]' \
-x 'substring(text(), 2)' \
myfile.xml
file
그러면 전체 입력 문서에서 값이 로 시작하는 모든 노드를 찾은 /
다음 를 사용하여 첫 번째 문자를 제거합니다 substring()
.
결과:
<?xml version="1.0"?>
<root>
<file>text</file>
<file>text2</file>
<file>text</file>
<file>other text</file>
</root>
이것(그리고 아래의 것)은 값에 줄 바꿈이 포함된 노드를 처리합니다.
처음뿐만 아니라 값의 어느 곳에서나 감지하고 싶습니까 /
? 모두 제거하려면 대신 다음을 사용할 수 contains()
있습니다 translate()
.
xmlstarlet edit \
--update '//file[contains(text(), "/")]' \
--expr 'translate(text(), "/", "")' \
myfile.xml
또는 그냥( translate()
값이 없으면 호출은 값을 변경하지 않고 그대로 둡니다)/
xmlstarlet edit \
--update '//file' \
--expr 'translate(text(), "/", "")' \
myfile.xml
다음 입력 파일이 주어지면:
<?xml version="1.0"?>
<root>
<file>text/</file>
<file>/text/2</file>
<file>te/x/t/</file>
<file>other text</file>
</root>
...위 명령은 다음과 같은 결과를 생성합니다.
<?xml version="1.0"?>
<root>
<file>text</file>
<file>text2</file>
<file>text</file>
<file>other text</file>
</root>
답변2
입력(고정 구문) XML
파일( >
두 번째 노드 닫기 누락 file
):
<r>
<file>/text</file>
<file>/text2</file>
<file>/text</file>
</r>
현대적인 구문과 올바른 XPath
기능을 갖추고 있습니다.fn:replace()
(약간의 sed
for XPath
, 정규식 사용 허용 및캡처 그룹버전 XPath
>= 2), 를 사용하면 XQuery
다음을 수행할 수 있습니다.
xidel --xquery '
<r>{
for $x in //file
return <file>{replace($x, "^/(.*)", "$1")}</file>
}</r>
' --output-format=xml file.xml
추론:
<?xml version="1.0" encoding="UTF-8"?>
<r>
<file>text</file>
<file>text2</file>
<file>text</file>
</r>
즉시 파일을 편집해야 하는 경우 sponge
다음 도구를 사용하십시오 GNU
more-utils
.
xidel ... file.xml | sponge file.xml
- 정규식 개요
XPath/XQuery
https://www.regular-expressions.info/xpath.html XPath
예, 하위 집합입니다XQuery
. 확인하다xpath-xquery-와-xpointer의 차이점xidel
HTML/XML 작업의 스위스 군용 칼입니다.XQuery
프로세서(오픈 소스)를 사용할 수도 있습니다 .BaseX
XQuery
표현식 실행
답변3
입력에 한 줄에 두 개의 슬래시만 있는 경우 다음 awk 명령을 시도해 볼 수 있습니다.
$ awk 'BEGIN{OFS=FS="/"}{printf "%s", $1;print$2,$3}' input_file
<file>text</file>
<file>text2</file
<file>text</file>
printf의 위치를 변경하고 제거하려는 슬래시를 기준으로 인쇄해야 합니다.
답변4
사용행복하다(이전 Perl_6)
...Raku(커뮤니티 지원) XML
모듈 사용:
~$ raku -MXML -e 'my $xml = open-xml( $*ARGFILES.Str );
for $xml.elements( :RECURSE(0), :TAG{"file"} ) -> $E {
my $old = $E.contents[0];
my $new = XML::Text.new( text => $old.text.subst(/^ "/" /) );
$E.replace( $old, $new );
}; .say for $xml;' file.xml
Raku는 고급 기능을 갖춘 Perl 제품군의 프로그래밍 언어입니다.문법텍스트를 구문 분석하는 데 사용됩니다. 위에서는 기본 버전이 사용되었습니다.XML 구문Raku의 객체 지향 XML
모듈인 Engine은 입력 XML
파일을 구문 분석합니다. 따라서 XML 요소가 인식되고 반복될 수 있습니다.
정규식 전용(예: sed
) 솔루션 의 한 가지 문제점 XML
은 교체가 난잡한 경향이 있다는 것입니다. 교체를 특정 깊이/태그로만 제한하는 데 어려움을 겪는 경우가 많습니다. -module을 사용하는 Raku에서는 XML
(예를 들어) 교체를 1)로 제한할 수 있습니다. 최상층 및 2). TAG 내에서만 가능합니다 <file>
. 이는 elements
제약 조건 내에서 반복 하도록 코드를 설정하여 수행됩니다 :RECURSE(0), :TAG{"file"}
. 여기서는 노드 :NEST
만 반복하도록 추가할 수도 있습니다 .EVEN
[모든 깊이에서 모든 s를 반복하려는 경우 TAG
걱정하지 마십시오. 명명된 인수를 설정 :RECURSE(Inf)
하고 제거하면 제한이 False로 설정됩니다.]:TAG
:TAG
이는 각 요소의 내부 부분(즉, TAG가 아닌 부분)이 실제로 객체인 contents[0]
변수에 할당되었음을 확인합니다 . 문제가 되는 슬래시를 제거하기 위해 객체는 아무것도 없는 문자열 로 추출 됩니다 . 이제 수정된 키/값 쌍을 사용하여 새( ) 객체를 생성( )합니다 . 이제부터 -module의 루틴이 작업을 수행합니다.$old
XML::Text
$old
.text
subst
"/"
XML::Text.new
$new
text => 'value'
XML
replace
replace( $old, $new )
입력 예(@Kusalananda에게 감사드립니다!):
<?xml version="1.0"?>
<root>
<file>/text</file>
<file>/text2</file>
<file>/text</file>
<file>other text</file>
</root>
출력 예(선행 - /
<file> 태그에서 제거됨):
<?xml version="1.0"?><root>
<file>text</file>
<file>text2</file>
<file>text</file>
<file>other text</file>
</root>
https://github.com/raku-community-modules/XML
https://raku.land/?q=XML
https://rakudo.org/
https://raku.org