SED 명령은 두 태그 사이의 슬래시 "/"를 제거합니다.

SED 명령은 두 태그 사이의 슬래시 "/"를 제거합니다.

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()(약간의 sedfor 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

답변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의 루틴이 작업을 수행합니다.$oldXML::Text$old.textsubst"/"XML::Text.new$newtext => 'value'XMLreplacereplace( $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

관련 정보